Avatar billede borrisholt Novice
29. marts 2001 - 10:18 Der er 8 kommentarer og
1 løsning

Harddisk info.

Jeg skal bruge informationer om Harddisk på det fysiske niveau. specielt skal jeg bruge en viden om hvormange harddiske der sidder i maskiner og hvilke partioner den er indelt i ...

PS. Jeg kender selv  funktionen API GetVolumeInformation()

Jens B
Avatar billede martinlind Nybegynder
29. marts 2001 - 12:08 #1
Læs partionstablen, de første spor på disken.
Avatar billede martinlind Nybegynder
29. marts 2001 - 12:08 #2
MSDOS TechRef.
Avatar billede borrisholt Novice
29. marts 2001 - 12:10 #3
Jeg må vist hellere specificere .. JEg skal bruge nogle funktions kald eller noget source code ....

Jens B
Avatar billede martinlind Nybegynder
29. marts 2001 - 12:12 #4
Det står også i MSDOS techRef. Det er BIOS Kald de virker, det er muligt du kan slippe afsted med noget Win. men jeg tror det ikke hvis Partion Magic og den slags boot\'er jo alle i dos hvis de skal pille for alvor.
Avatar billede borrisholt Novice
29. marts 2001 - 12:35 #5
Martin >> nu har jeg selv fundet svaret :

Man skal brugen en funktion her hedder DeviceIoControl().
Før du kan bruge den skal man først prote Winioctl.h til Delphi. (godt jeg havde gjort det for længe siden)


Hvis du så vil vide hvormange cylindere din HD har så skriver du:

procedure ReadBoot(Drive: Char);
var
  BytesRead: Cardinal;
  H: THandle;
  _DISK_GEOMETRY : DISK_GEOMETRY;
begin
  H := CreateFile(PChar(Format(\'\\\\.\\%s:\', [UpCase(Drive)])), GENERIC_READ, FILE_SHARE_WRITE  or FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if H = INVALID_HANDLE_VALUE then
    raise Exception.Create(SysErrorMessage(GetLastError));
  try
(*
BOOL DeviceIoControl(

    HANDLE hDevice,    // handle to device of interest
    DWORD dwIoControlCode,    // control code of operation to perform
    LPVOID lpInBuffer,    // pointer to buffer to supply input data
    DWORD nInBufferSize,    // size of input buffer
    LPVOID lpOutBuffer,    // pointer to buffer to receive output data
    DWORD nOutBufferSize,    // size of output buffer
    LPDWORD lpBytesReturned,    // pointer to variable to receive output byte count
    LPOVERLAPPED lpOverlapped     // pointer to overlapped structure for asynchronous operation
  );
*)  DeviceIoControl(
        h,
        IOCTL_DISK_GET_DRIVE_GEOMETRY,
        nil,
        0,
        @_DISK_GEOMETRY,
        sizeof(_DISK_GEOMETRY),
        BytesRead,
        nil
        );
        form1.Caption := IntToStr(_DISK_GEOMETRY.Cylinders);
  finally
    CloseHandle(H)
  end;
end;


Så er det bare at kalde den :

  ReadBoot(\'c\');

Jens B

Avatar billede borrisholt Novice
29. marts 2001 - 12:36 #6
source code on request.

Jens B

Avatar billede martinlind Nybegynder
29. marts 2001 - 12:41 #7
Gerne tak, martin@e-lind.dk
Avatar billede martinlind Nybegynder
29. marts 2001 - 12:46 #8
eller bruger denne param

IOCTL_DISK_GET_PARTITION_INFO   
Avatar billede borrisholt Novice
29. marts 2001 - 12:50 #9
Til at starte med bruger jeg den her :
  IOCTL_DISK_GET_DRIVE_GEOMETRY

Så kan jeg tage hul på resten bagefter ....

Vent lige 10 min så får du et eksempel.
Jens B
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