Seite 1 von 1

Ausrechnen von Konstanten mit CTL_CODE in PB ??

Verfasst: 28.05.2005 20:42
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

Re: Ausrechnen von Konstanten mit CTL_CODE in PB ??

Verfasst: 28.05.2005 21:49
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

Verfasst: 28.05.2005 22:52
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

Verfasst: 28.05.2005 22:54
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

Verfasst: 29.05.2005 21:04
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