AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

Ein Thema von Schwedenbitter · begonnen am 9. Mai 2011 · letzter Beitrag vom 16. Mai 2011
Antwort Antwort
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, 13: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#2

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

  Alt 9. Mai 2011, 14:41
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Schwedenbitter

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

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

  Alt 9. Mai 2011, 16:04
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 GetDriveType() liefert, sind ärmlich, wenn man bedenkt, dass es seit Jahren DVD, Blueray etc. gibt.

Irgendwo im Forum hatte ich auch ein Kombination aus DeviceIoControl() und dem Auslesen der Registrywerte unterhalb von 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 DeviceType aus dem Record _CHANGER_PRODUCT_DATA genauso wenig aussagekräftig ist, die die WinAPI-Funktion, könnte ich im Grunde auch schon aufgeben...
[/EDIT]

Gruß, Alex
Alex Winzer

Geändert von Schwedenbitter ( 9. Mai 2011 um 16:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#4

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

  Alt 13. Mai 2011, 22:17
Delphi-Quellcode:
Const
  IOCTL_CHANGER_GET_PRODUCT_DATA   = $00304008;
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.
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.

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?: Учиться, учиться, учиться
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
madtom

Registriert seit: 24. Feb 2005
Ort: Hamburg
115 Beiträge
 
Delphi XE7 Professional
 
#5

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

  Alt 13. Mai 2011, 22:27
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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#6

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

  Alt 13. Mai 2011, 22:33
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 ...
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
madtom

Registriert seit: 24. Feb 2005
Ort: Hamburg
115 Beiträge
 
Delphi XE7 Professional
 
#7

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

  Alt 13. Mai 2011, 22:44
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++ )

Gruß Madtom
Thomas

Geändert von madtom (13. Mai 2011 um 22:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#8

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

  Alt 13. Mai 2011, 22:54
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++ )
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).
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)

Geändert von Assarbad (13. Mai 2011 um 23:03 Uhr)
  Mit Zitat antworten Zitat
Schwedenbitter

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

AW: IOCTL_CHANGER_GET_PRODUCT_DATA und "Ungültige Funktion"

  Alt 16. Mai 2011, 12:29
Hallo,

... 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 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.

Dank, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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