Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion" (https://www.delphipraxis.net/160344-ioctl_changer_get_product_data-und-ungueltige-funktion.html)

Schwedenbitter 9. Mai 2011 12:52

IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
 
Hallo,

ich habe bereits sowohl im Forum als auch im Web nach einer Lösung gesucht, aber nichts gefunden. Ausgehend von der unit JwaWinIoctl habe ich folgenden Code erarbeitet:
Delphi-Quellcode:
Const
  IOCTL_CHANGER_GET_PRODUCT_DATA   = $00304008;
  {$EXTERNALSYM IOCTL_CHANGER_GET_PRODUCT_DATA}

Type
  PCHANGER_PRODUCT_DATA   = ^CHANGER_PRODUCT_DATA;
  {$EXTERNALSYM PCHANGER_PRODUCT_DATA}
  _CHANGER_PRODUCT_DATA   = Record
                             VendorId      : Array [0..7] Of BYTE;
                             ProductId   : Array [0..15] Of BYTE;
                              Revision      : Array [0..3] Of BYTE;
                              SerialNumber: Array [0..31] Of BYTE;
                              DeviceType   : BYTE;
                             End;
  {$EXTERNALSYM _CHANGER_PRODUCT_DATA}
  CHANGER_PRODUCT_DATA      = _CHANGER_PRODUCT_DATA;
  {$EXTERNALSYM CHANGER_PRODUCT_DATA}
  TChangerProductData      = CHANGER_PRODUCT_DATA;
  PChangerProductData      = PCHANGER_PRODUCT_DATA;

Function GetDiskData(RootPath: String): String;
Var
  hDevice         : THandle;
  ProductData      : TChangerProductData;
  BytesReturned   : DWord;
Begin
  hDevice:=CreateFile(PChar('\\.\' + RootPath),
    GENERIC_READ or GENERIC_WRITE, 0, nil,
    OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
  If (hDevice <> INVALID_HANDLE_VALUE) Then
  Begin
    If DeviceIoControl(hDevice, IOCTL_CHANGER_GET_PRODUCT_DATA, nil, 0,
      @ProductData, SizeOf(ProductData), BytesReturned, nil) then
    Begin
      Result:=RootPath + ' - OK!';
    End
    Else Result:=RootPath + ' - ' + SysErrorMessage(GetLastError);
    CloseHandle(hDevice);
  End
  Else Result:=RootPath + ' - Device not opened...';
End;

procedure TForm1.FormCreate(Sender: TObject);
Var
  I            : Integer;
begin
  For I:=1 To 26 Do
    ListBox1.Items.Add(GetDiskData(Chr(I + 64) + ':'));
end;
Leider komme ich immer in den Zwei, wo er mit
Delphi-Quellcode:
SysErrorMessage(GetLastError)
anzeigt. Allerdings kann ich mit der Meldung "Ungültige Funktion" nicht soviel anfangen.

Wo liegt mein Fehler?

Ich hatte hier mal ein entsprechende Code-Fragment gefunden und auch gesehen, dass es himitsu irgendwie hinbekommen haben muss, denn die späteren Versionen seines Programmes arbeiten auf meinen Rechnern.

Gruß & Dank, Alex

himitsu 9. Mai 2011 13:41

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
 
Kann's grade nicht nachprüfen, aber meine vorkompilierte Datei hier liefert auch gerade (hier im Windows 7) keine Werte, obwohl die ötigen rechte vorhanden wären.
Kann sein, daß es mit win7 einige neue probleme gibt.

PS: Für den Zugriff auf Festplatten benötigt man mehr Rechte, als für CD/DVD-Laufwerke ... also für das Erstellen des Handles auf die Datenträger/Geräte.

Schwedenbitter 9. Mai 2011 15:04

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
 
Danke auch für die PM!

Ich benutze hier nur WinXP. Ich habe weder Vista noch 7, so dass ich das sowieso nicht ausprobieren könnte.
Mir geht es wirklich und ausschließlich um den DriveType. Die 5 Werte, die einem die WinAPI-Funktion
Delphi-Quellcode:
GetDriveType()
liefert, sind ärmlich, wenn man bedenkt, dass es seit Jahren DVD, Blueray etc. gibt.

Irgendwo im Forum hatte ich auch ein Kombination aus
Delphi-Quellcode:
DeviceIoControl()
und dem Auslesen der Registrywerte unterhalb von
Delphi-Quellcode:
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi
gefunden. Aber erstens empfinde ich das eher als Workaround, zweitens können die Schlüssel wechseln, drittens ist mein Projekt ziemlich Zeitkritisch und viertens gibt es ja in der Theorie den Zugriff über die WinAPI-Funktion.

Ich habe lediglich in ein paar russichen Foren etwas dazu gefunden. Aber leider spreche ich kein Russisch mehr :(

[EDIT]
Falls mir jemand positiv sagen kann, dass das
Delphi-Quellcode:
DeviceType
aus dem Record
Delphi-Quellcode:
_CHANGER_PRODUCT_DATA
genauso wenig aussagekräftig ist, die die WinAPI-Funktion, könnte ich im Grunde auch schon aufgeben...
[/EDIT]

Gruß, Alex

Assarbad 13. Mai 2011 21:17

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1099697)
Delphi-Quellcode:
Const
  IOCTL_CHANGER_GET_PRODUCT_DATA   = $00304008;
Leider komme ich immer in den Zwei, wo er mit
Delphi-Quellcode:
SysErrorMessage(GetLastError)
anzeigt. Allerdings kann ich mit der Meldung "Ungültige Funktion" nicht soviel anfangen.

Code:
#define FILE_READ_ACCESS         ( 0x0001 )   // file & pipe
#define METHOD_BUFFERED                0
#define FILE_DEVICE_CHANGER            0x00000030
#define IOCTL_CHANGER_BASE             FILE_DEVICE_CHANGER

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)

#define IOCTL_CHANGER_GET_PRODUCT_DATA      CTL_CODE(IOCTL_CHANGER_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
Rechnen wir also mal nach:

Code:
(0x00000030 << 16) | ((0x0001) << 14) | ((0x0002) << 2) | (0)
Der Wert den du schickst ist also korrekt. In diesem Falle dürfte wohl das angesprochene Device einfach nicht diese Funktion unterstützen.

Zitat:

Zitat von Schwedenbitter (Beitrag 1099747)
Ich habe lediglich in ein paar russichen Foren etwas dazu gefunden. Aber leider spreche ich kein Russisch mehr :(

Wie hat Lenin so schön gesagt?: Учиться, учиться, учиться

madtom 13. Mai 2011 21:27

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
 
Zitat:

Ich habe lediglich in ein paar russichen Foren etwas dazu gefunden. Aber leider spreche ich kein Russisch mehr
Hast Du einen Link? Ich kann recht gut russisch.

Gruß Madtom :)

Assarbad 13. Mai 2011 21:33

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
 
Zitat:

Zitat von madtom (Beitrag 1100702)
Hast Du einen Link? Ich kann recht gut russisch.

Einer ist der hier: http://www.rsdn.ru/forum/winapi/2033400.all.aspx

Da gibt's aber für die o.g. Methode auch keine Antwort (sondern nur für die andere Methode die der Fragesteller probiert hatte). Aber ich würde ohnehin sagen, daß hier die SetupAPI angebrachter ist ...

madtom 13. Mai 2011 21:44

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
 
Hallo Assarbad,

der "Autor" stellt Funktionen vor, um die Seriennummern aller Geräte des Computers zu ermitteln. Dafür nimmt er:

a) das WinAPI und
b) WMI

ausprobiert habe ich die Funktionen aber nicht. (ist eh C++ :wall:)

Gruß Madtom :-D

Assarbad 13. Mai 2011 21:54

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
 
Zitat:

Zitat von madtom (Beitrag 1100704)
Hallo Assarbad,

der "Autor" stellt Funktionen vor, um die Seriennummern aller Geräte des Computers zu ermitteln. Dafür nimmt er:

a) das WinAPI und
b) WMI

ausprobiert habe ich die Funktionen aber nicht. (ist eh C++ :wall:)

Danke, aber ich verstehe Russisch und C++. Außerdem benutzt er drei Methoden. Die dritte ist SetupAPI, die ich in meiner vorigen Antwort bereits erwähnte. Hast aber insofern recht, daß er die SetupAPI hier nicht dazu nutzt um die Geräteeigenschaften zu ermitteln (was damit aber gehen sollte).

Schwedenbitter 16. Mai 2011 11:29

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
 
Hallo,

Zitat:

Zitat von Assarbad (Beitrag 1100705)
... Hast aber insofern recht, daß er die SetupAPI hier nicht dazu nutzt um die Geräteeigenschaften zu ermitteln (was damit aber gehen sollte).

<- Hervorhebung durch mich.

Also mir geht es gerade um das Herausfinden der Geräteeigenschaften. Denn ich möchte gern wissen, ob sich hinter
Delphi-Quellcode:
DRIVE_CDROM
tatsächlich "nur" ein CD-ROM verbirgt, was heute eher unwahrscheinlich ist, oder aber eben ein DVD-RAM, -ROM, Blueray etc. pp..
@Assarbad:
Da Du selbst sagst, dass es gehen sollte und ich es mit meiner Methode aus dem ersten Post nicht hinbekommen, würde ich mich über weitere Hilfen sehr freuen; zumal Du explizit schreibst, "was damit aber gehen sollte.".

Falls diese Frage jemandem zu weit ab von der Ausgangsfrage ist, mache ich gern ein neues Thema auf.:thumb:

Dank, Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz