![]() |
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 ![]()
Delphi-Quellcode:
Leider komme ich immer in den Zwei, wo er mit
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;
Delphi-Quellcode:
anzeigt. Allerdings kann ich mit der Meldung "Ungültige Funktion" nicht soviel anfangen.
SysErrorMessage(GetLastError)
Wo liegt mein Fehler? Ich hatte ![]() Gruß & Dank, Alex |
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. |
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:
liefert, sind ärmlich, wenn man bedenkt, dass es seit Jahren DVD, Blueray etc. gibt.
GetDriveType()
Irgendwo im Forum hatte ich auch ein Kombination aus
Delphi-Quellcode:
und dem Auslesen der Registrywerte unterhalb von
DeviceIoControl()
Delphi-Quellcode:
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.
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi
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:
aus dem Record
DeviceType
Delphi-Quellcode:
genauso wenig aussagekräftig ist, die die WinAPI-Funktion, könnte ich im Grunde auch schon aufgeben...
_CHANGER_PRODUCT_DATA
[/EDIT] Gruß, Alex |
AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
Zitat:
Code:
Rechnen wir also mal nach:
#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)
Code:
Der Wert den du schickst ist also korrekt. In diesem Falle dürfte wohl das angesprochene Device einfach nicht diese Funktion unterstützen.
(0x00000030 << 16) | ((0x0001) << 14) | ((0x0002) << 2) | (0)
Zitat:
|
AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
Zitat:
Gruß Madtom :) |
AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
Zitat:
![]() 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 ... |
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 |
AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
Zitat:
|
AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"
Hallo,
Zitat:
Also mir geht es gerade um das Herausfinden der Geräteeigenschaften. Denn ich möchte gern wissen, ob sich hinter
Delphi-Quellcode:
tatsächlich "nur" ein CD-ROM verbirgt, was heute eher unwahrscheinlich ist, oder aber eben ein DVD-RAM, -ROM, Blueray etc. pp..
DRIVE_CDROM
@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:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz