Some Example demo program in MSDN
/* The code of interest is in the subroutine GetDriveGeometry. The
  code in main shows how to interpret the results of the IOCTL call. */
 
#include <windows.h>
#include <winioctl.h>
 
BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
    HANDLE hDevice;              // handle to the drive to be examined
    BOOL bResult;                // results flag
    DWORD junk;                  // discard results
 
    hDevice = CreateFile("\\\\.\\PhysicalDrive0",  // drive to open
                    0,                // no access to the drive
                    FILE_SHARE_READ | // share mode
                    FILE_SHARE_WRITE,
                    NULL,            // default security attributes
                    OPEN_EXISTING,    // disposition
                    0,                // file attributes
                    NULL);            // do not copy file attributes
 
    if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
    {
        return (FALSE);
    }
 
    bResult = DeviceIoControl(hDevice,    // device to be queried
        IOCTL_DISK_GET_DRIVE_GEOMETRY,    // operation to perform
                    NULL, 0,              // no input buffer
                    pdg, sizeof(*pdg),    // output buffer
                    &junk,                // # bytes returned
                    (LPOVERLAPPED) NULL);  // synchronous I/O
 
    CloseHandle(hDevice);
 
    return (bResult);
}
 
int main(int argc, char *argv[])
{
    DISK_GEOMETRY pdg;            // disk drive geometry structure
    BOOL bResult;                // generic results flag
    ULONGLONG DiskSize;          // size of the drive, in bytes
 
    bResult = GetDriveGeometry (&pdg);
 
    if (bResult)
    {
        printf("Cylinders = %I64d\n", pdg.Cylinders);
        printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
        printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
        printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);
 
        DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
            (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
        printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize,
            DiskSize / (1024 * 1024));
    }
    else
    {
        printf("GetDriveGeometry failed. Error %ld.\n", GetLastError());
    }
 
    return ((int)bResult);
}



the include file windows.h and winioctl.h do not exist in the MASM...which file(s) should I include?
Posted on 2005-12-12 02:53:23 by Eric4ever
windows.h has windows.inc as analog for asm. winioctl.h should have also inc: it can be made manually or with some h2inc converting tools
Posted on 2005-12-12 03:09:00 by Shoo
the h2inc cannot convert the winioctl.h, there is a syntax error:identifier 'DWORD' in line 179:
WINIOCTL.H<179>:error HI2061:syntax error:identifier 'DWORD' 


Is there any other way to convert it?
And Cannot it  interpret the results of the IOCTL call in MASM?
Posted on 2005-12-12 19:13:19 by Eric4ever
Hey Dude,

Try this Macro in MASM:

CTL_CODE MACRO DeviceType:=<0>, Function:=<0>, Method:=<0>, Access:=<0>
EXITM %(((DeviceType) SHL 16) OR ((Access) SHL 14) OR ((Function) SHL 2) OR (Method))
ENDM


Heres the code you need:

IOCTL_DISK_GET_DRIVE_GEOMETRY  equ  CTL_CODE(IOCTL_DISK_BASE, 0x0000,  METHOD_BUFFERED, FILE_ANY_ACCESS)

Heres the def's you'll need:

IOCTL_DISK_BASE  =  7
METHOD_BUFFERED  =  0
FILE_ANY_ACCESS  =    0


Posted on 2005-12-12 22:06:14 by The Dude of Dudes