Autor Beitrag
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 20.06.17 08:45 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4155
Erhaltene Danke: 865

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: 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))?

s.a. Beschreibung von lpInBuffer in IOCTL_STORAGE_QUERY_PROPERTY control code

Schau mal für ein Beispiel in Get Physical Drive Serial Number – Part 1 (besonders "2. Set the STORAGE_PROPERTY_QUERY input data structure.").
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 20.06.17 11:05 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 20.06.17 22:59 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4155
Erhaltene Danke: 865

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: 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ß
ausblenden Delphi-Quelltext
1:
sizeof(Boolean)					
den Wert 1 hat, aber in C# per Default-Marshalling 4.

Probiere daher mal
ausblenden 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

PS: Steht auch so in P/Invoke: STORAGE_DEVICE_DESCRIPTOR (Structures) ;-)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 21.06.17 08:52 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4155
Erhaltene Danke: 865

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: 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, aber dieser ist nur im unsafe-Kontext verwendbar. Für die Übergabe per Marshalling wirst du diesen aber nicht verwenden können.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4449
Erhaltene Danke: 917


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 21.06.17 10:58 
- Nachträglich durch die Entwickler-Ecke gelöscht -