Ausrechnen von Konstanten mit CTL_CODE in PB ??

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Lupo
Beiträge: 147
Registriert: 16.02.2005 15:15

Ausrechnen von Konstanten mit CTL_CODE in PB ??

Beitrag von Lupo »

Ich hab ein Problem:

Ich brauch die Werte von den API Konstanten IOCTL_STORAGE_MEDIA_REMOVAL
und IOCTL_STORAGE_EJECT_MEDIA sowie FSCTL_LOCK_VOLUME und
FSCTL_DISMOUNT_VOLUME weil ich möchte die Funktion
DeviceIoControl_() benutzen um ein Streamerlaufwerk zu entsperren und dann die Kassette
auszuwerfen.

Nun habe ich wie irr gesucht und Danilos Hinweis gefunden das man alle Api Konstanten
in der Include Datei von dem SDK findet. Aber das stimmt nur teilweise. Blöderweise
muß man sich nen haufen Konstanten erst umständlich rausrechnen und zwar mit einer CTL_CODE
Funktion und natürlich genau die die ich brauch :evil:

Code: Alles auswählen

#define IOCTL_STORAGE_MEDIA_REMOVAL           CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_STORAGE_EJECT_MEDIA             CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
Jetzt steht natürlich nirgends was die CTL_CODE Funktion tut.

Ich hab dann gegoogeld und wenigstens ein VB Code gefunden:

Code: Alles auswählen

Private Function CTL_CODE(lngDeviceType, lngFunction, lngMethod, lngAccess) As Long CTL_CODE = ((lngDeviceType * (2 ^ 16)) Or (lngAccess * (2 ^ 14)) Or  (lngFunction * (2 ^ 2)) Or lngMethod) End Function 
in PB:

Code: Alles auswählen

CTL_CODE.l = lngDeviceType * Pow(2,16) |  lngAccess * Pow(2,14)  | lngFunction * Pow(2,2) | lngMethod
Ich hoff das stimmt so.

mit den rausgesuchten Konstanten isses:

Code: Alles auswählen

#IOCTL_STORAGE_BASE = $2D
#METHOD_BUFFERED  = 0
#FILE_READ_ACCESS = 1 

 IOCTL_STORAGE_EJECT_MEDIA.l  =  #IOCTL_STORAGE_BASE  * Pow(2,16)  |  $201 * Pow(2,14)  |  #METHOD_BUFFERED * Pow(2,2)  |  #FILE_READ_ACCESS
Anstatt dass ich jetzt endlich den Wert für IOCTL_STORAGE_EJECT_MEDIA bekomm meckert
der PB Compiler das er Floats nicht mit | verwenden kann....

jetzzt habs ich halt umgebaut in

Code: Alles auswählen

#IOCTL_STORAGE_BASE = $2D
#METHOD_BUFFERED  = 0
#FILE_READ_ACCESS = 1 

term1.l = #IOCTL_STORAGE_BASE  * Pow(2,16)  
term2.l = $202 * Pow(2,14)  
term3.l = #METHOD_BUFFERED * Pow(2,2)
term4.l = #FILE_READ_ACCESS

IOCTL_STORAGE_EJECT_MEDIA.l  = term1 | term2 | term3 | term4

Debug IOCTL_STORAGE_EJECT_MEDIA
Jetzt krieg ich was raus aber es ist was falsches, nämlich 11370497
aber rauskommen sollte 2967560, das hab ich nämlich im i-net wo
gefunden.
Die drei anderen Kostanten Konstanten IOCTL_STORAGE_MEDIA_REMOVAL,
IOCTL_STORAGE_EJECT_MEDIA , FSCTL_LOCK_VOLUME
hab ich aber nicht und die sind sicher falsch wenn ich sie so rausrechne mit CTL_CODE.

Hat wer eine Idee was falsch ist ? Ich komm nicht weiter. Der ganze Tag ist versaut mit
Herumgesuche. :bluescreen:

Voll super wär natürlich eine Liste wo wirklich alle Konstanten drinstehen....

Vielen Dank

LUPO
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Ausrechnen von Konstanten mit CTL_CODE in PB ??

Beitrag von Danilo »

Lupo hat geschrieben:Nun habe ich wie irr gesucht und Danilos Hinweis gefunden das man alle Api Konstanten
in der Include Datei von dem SDK findet. Aber das stimmt nur teilweise. Blöderweise
muß man sich nen haufen Konstanten erst umständlich rausrechnen und zwar mit einer CTL_CODE
Funktion und natürlich genau die die ich brauch :evil:
Das kommt im SDK öfters vor und sind MACROs. Wenn Du nach
'#define CTL_CODE' suchst, solltest Du es finden.

Alternativ kannst Du einfach ein ganz simples Programm mit
C oder C++ machen. Ist so einfach das es jeder anwenden
kann - mit irgendeinem freien Compiler, z.B. gcc / DevC++.

Code: Alles auswählen

#include <iostream>
#include <stdlib.h>

//#include <windows.h>
#include <Winioctl.h>

using namespace std;

int main() {
  cout << IOCTL_STORAGE_MEDIA_REMOVAL << endl
       << IOCTL_STORAGE_EJECT_MEDIA   << endl
       << FSCTL_LOCK_VOLUME           << endl
       << FSCTL_DISMOUNT_VOLUME       << endl;

  system("PAUSE");
  return 0;
}
Ausgabe:

Code: Alles auswählen

2967556
2967560
589848
589856
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Lupo
Beiträge: 147
Registriert: 16.02.2005 15:15

Beitrag von Lupo »

Juhu !!! Ich weis endlich die Konstanten ! :D :D :D

Vielen Dank Danilo für die Hilfe :allright:

Muß ich halt mit dem C Kompiler machen.

Aber interessieren würds mich doch warum das
Ausrechenn mit dem PB Code nicht hinhaut..

Danke

LUPO
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Versuchs mal ohne [c]Pow()[/c] und dann mit den Shift-Befehlen:

Code: Alles auswählen

CTL_CODE.l = lngDeviceType << 16 |  lngAccess << 14  | lngFunction << 2 | lngMethod
Benutzeravatar
Lupo
Beiträge: 147
Registriert: 16.02.2005 15:15

Beitrag von Lupo »

Ja super funktioniert auch, danke Nic :allright:

Kommt auch genau dasselbe heraus, nämlich 11370497
sollte aber 2967556 sein, wird irgendeine der Konstanten
falsch sein, hauptsache die Rechnung stimmt.

Danke

LUPO
Antworten