Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

  Alt 9. Mai 2011, 12:52
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 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
Alex Winzer
  Mit Zitat antworten Zitat