Avatar billede kjsksed Nybegynder
16. juni 2002 - 22:11 Der er 4 kommentarer og
1 løsning

Handle til partition fra CreateFile() VC++.

Er der nogen der ved syntaksen for at få en device handle direkte til en partition for raw read/write ?

Jeg kan åbne disk med:
CreateFile( "\\\\.\\PhysicalDrive0", ...... )

Jeg har forsøgt med :
CreateFile( "\\\\.\\PhysicalDrive0\\1:", ...... )
Men får en fejlkode 31.
Avatar billede kamikaze Nybegynder
17. juni 2002 - 10:39 #1
Hvad vil du kunne direkte på en partition???
Avatar billede chries Nybegynder
17. juni 2002 - 11:27 #2
Har du prøvet med store bogstaver og har du admin adgang ?

· The caller must have administrative privileges for the operation to succeed on a hard disk drive.
· The lpFileName string should be of the form \\.\PHYSICALDRIVEx to open the hard disk x. Hard disk numbers start at zero. For example:

String  Meaning
\\.\PHYSICALDRIVE2  Obtains a handle to the third physical drive on the user's computer.

· The lpFileName string should be \\.\x: to open a floppy drive x or a partition x on a hard disk. For example:

String  Meaning
\\.\A: Obtains a handle to drive A on the user's computer.
\\.\C: Obtains a handle to drive C on the user's computer.

Windows 95: This technique does not work for opening a logical drive. In Windows 95, specifying a string in this form causes CreateFile to return an error.

· The dwCreationDistribution parameter must have the OPEN_EXISTING value.
· When opening a floppy disk or a partition on a hard disk, you must set the FILE_SHARE_WRITE flag in the dwShareMode parameter.
Avatar billede chries Nybegynder
17. juni 2002 - 11:31 #3
der er et eksempel her:

      char TmpStr[26] = "\\\\.\\PHYSICALDRIVE0";
      TmpStr[17] = i+'0';
      if((hDisk[i+0x80]=CreateFile(TmpStr,
                                  GENERIC_READ|GENERIC_WRITE,
                                  FILE_SHARE_READ,
                                  NULL,
                                  OPEN_EXISTING,
                                  FILE_FLAG_NO_BUFFERING,
                                  NULL))==INVALID_HANDLE_VALUE)
        break;

http://www.codeguru.com/system/Undelete.html
Avatar billede kjsksed Nybegynder
17. juni 2002 - 18:09 #4
til kamikaze - Jeg skal læse data fra en disk (tilsluttet firewire). Data er lagret som "raw" data (ingen filsystem). Drevet har ikke noget bogstav, da systemet ikke kan genkende drevet.

til chries - Dit eksempel giver kun handle til drevet ikke til selve partitionen.

Men jeg har selv fundet løsningen...
Jeg kan få offset til partition ved at kalde DeviceIoControl med kommandoen IOCTL_DISK_GET_DRIVE_LAYOUT. Dette kald retunerer info i struct DRIVE_LAYOUT_INFORMATION element "PartitionEntry", som er en array af struct PARTITION_INFORMATION som har elementet "StartingOffset". Ved at kalde SetFilePointerEx(...) sættes fil pointer til "StartingOffset", og så kan man bruge ReadFile(...) til at læses data råt fra partitionen, hvis nogen skulle være interesseret!
Avatar billede kamikaze Nybegynder
17. juni 2002 - 22:39 #5
kjsksed  >> Kan du ikke lige smide lidt af koden her??? Det lyder temmelig interessant :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester