windows - Brug 64-bits driver fra 32-bit applikation

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en Windows-applikation, der skal køre som 32-bit (på grund af andre begrænsninger uden for min kontrol). Men min ansøgning skal ringe til og få adgang til en driver, der kan være 32 bit eller 64 bit afhængigt af det system, hvor det er installeret.


Jeg får adgang til driveren via DeviceIoControl () opkald, udveksling af datastrukturer angivet i en inklusiv fil. Datastrukturer indeholder felter, der er angivet som 'DWORD\_PTR' (den medfølgende fil, jeg heller ikke kontrollerer).


Mit problem er, at driveren på et 64-bits system forventer, at strukturerne indeholder 64-bits heltal (på grund af DWORD\_PTR-erklæring). Men mit 32-bits program ser disse DWORD\_PTR som 32-biters heltal. Jeg har så en data mismatch mellem min programversion af datastrukturerne og førerens forståelse af disse strukturer.


DeviceIoControl () ender ikke op med ERROR\_INSUFFICIENT\_BUFFER (Dataområdet, der er overført til et systemopkald, er for lille). Jeg bekræftede, at jeg ikke får denne fejl, hvis jeg sender en 64-bits version af structs til chaufføren.


Jeg har nogle grimme muligheder ud af dette rod. Men jeg spekulerer på, om nogen har nogle pænere forslag?





Opløsning:



  • Erklære en ny kopi af de delte strukturer med REAL 64-bit datafelter (\_\_int64)

  • Kontroller OS-arkitekturen (32/64)

  • Brug 32-bit eller 64-bit version af strukturerne til DeviceIoControl () opkald.



Ulemper:



  • Jeg skal opretholde en eksplicit 64-bits kopi af strukturen deklarationen manuelt. Det kan være en smerte over tid.






Mine andre løsninger er variationer af denne, men de ALLTID involverer vedligeholdelse af en kopi af strukturs definitionen (f.eks. I en IDL til COM server-indstilling).


Rediger: Dette er en Microsoft-driver, og det ser ud til, at det ikke bruger IoIs32bitsProcess (irp)!

Bedste reference


Du opretholder både 32-bit og 64-biters version af strukturer og implementerer speciel håndtering via IoIs32BitProcess(irp) -funktionen i enhedsdriver DEVICE\_CONTROL -handler og konverter den til 64-bit struktur, når det er nødvendigt. Dette er den fælles måde at gøre det på.


Her er en god mængde dokumentation om det på MSDN. [4]


Da du senere har nævnt, at du ikke har kontrol over driverens kildekode, foreslår jeg at du opretholder din egen variant til 32-bit på 64-bit og sender den rigtige, der kontrollerer OS-arkitekturen. Det ser ud til, at strukturdeklarationer ikke udføres korrekt til føreren.

Andre referencer 1


Er der en måde at manipulere en #define på, når du inkluderer overskriften med strukturen defs sådan, at du altid bruger 64-bit definitionen? Det ser ud som den bedste mulighed for mig (hvis det er muligt).


Hvis ikke, skygger jeg 64-bit strukturen i min egen kode - på den måde er der kun en strucuture def til at passe på, snarere end en flok if32bit/if64bit ting sprinklet hele vejen igennem - det forekommer mere bugget. Måske kunne du gøre noget som:


\_ASSERT(sizeof(myStruct) == sizeof(64bitStruct)) 


i starten af ​​din app, så hvis du nogensinde får nye overskrifter, vil den første runde af din app minde dig om, at du skal synkronisere.