Entwickler-Ecke

Basistechnologien - Unzulässige Funktion - DeviceIoControl


Delete - Di 20.06.17 08:45
Titel: Unzulässige Funktion - DeviceIoControl
- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - Di 20.06.17 10:24

Hallo,

sehe ich das richtig, daß du die Query nicht befüllst (PropertyId, QueryType - entsprechend STORAGE_PROPERTY_QUERY (Structures) [http://www.pinvoke.net/default.aspx/Structures.STORAGE_PROPERTY_QUERY])?

s.a. Beschreibung von lpInBuffer in IOCTL_STORAGE_QUERY_PROPERTY control code [https://msdn.microsoft.com/de-de/library/windows/desktop/ff800830(v=vs.85).aspx]

Schau mal für ein Beispiel in Get Physical Drive Serial Number – Part 1 [http://codexpert.ro/blog/2013/10/26/get-physical-drive-serial-number-part-1/] (besonders "2. Set the STORAGE_PROPERTY_QUERY input data structure.").


Delete - Di 20.06.17 11:05

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delete - Di 20.06.17 22:59

- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - Mi 21.06.17 08:16

Schau dir mal genau die Werte bei dem Vergleich an (z.B. der Wert 11, in Delphi bei SerialNumberOffset, in C# aber bei ProductIdOffset)! Außerdem entspricht die Zahl 541152321 in Hex 0x20415441 (was wiederum 32 65 84 65 entspricht, also den bei Delphi ausgegeben Werten von RawDeviceProperties [3]-[6]).
Ich tippe also darauf, daß

Delphi-Quelltext
1:
sizeof(Boolean)                    
den Wert 1 hat, aber in C# per Default-Marshalling 4.

Probiere daher mal

C#-Quelltext
1:
2:
3:
4:
[MarshalAs(UnmanagedType.U1)]
public bool RemovableMedia;
[MarshalAs(UnmanagedType.U1)]
public bool CommandQueueing;

s.a. Default Marshaling for Boolean Types [https://msdn.microsoft.com/en-us/library/t2t3725f(v=vs.100).aspx]

PS: Steht auch so in P/Invoke: STORAGE_DEVICE_DESCRIPTOR (Structures) [http://www.pinvoke.net/default.aspx/Structures/STORAGE_DEVICE_DESCRIPTOR.html] ;-)


Delete - Mi 21.06.17 08:52

- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - Mi 21.06.17 10:07

Die Array-Größe ist ja dynamisch (entsprechend RawPropertiesLength), daher ist es eigentlich egal, wie groß man das statische Array in der Struktur macht (kommt nur auf die Sprache an, wie diese damit umgehen kann).

Analog zu C++ kennt auch C# den address-of-Operator [https://msdn.microsoft.com/de-de/library/aa664779(v=vs.71).aspx], aber dieser ist nur im unsafe-Kontext verwendbar. Für die Übergabe per Marshalling wirst du diesen aber nicht verwenden können.


Ralf Jansen - Mi 21.06.17 10:26

Die Adresse von irgendwas ist ja eigentlich auch nur glaubhaft für gepinnten/gefixten Speicher. Das wird sehr schnell sehr unschön.

Bei pinvoke klingt das auch falsch. Marshalling ist ja eher ein Kopiervorgang den ein Referenziervorgang. Es werden Daten aus dem unmanaged Memory in den managed Memory kopiert (oder halt umgekehrt). Eine gemeinsame Adresse von Caller und Callee die man sinnvoll teilen könnte gibt es nicht.


Delete - Mi 21.06.17 10:58

- Nachträglich durch die Entwickler-Ecke gelöscht -