windows-nt/Source/XPSP1/NT/base/wow64/setup/boot/driveex.c

185 lines
6.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include <windows.h>
#include <string.h>
#include "driveex.h"
#if 0
/* // See the "MS-DOS Programmer's Reference" for further information
// about this structure. */
typedef struct tagDEVICEPARAMS
{
BYTE bSpecFunc; /* Special functions */
BYTE bDevType; /* Device type */
WORD wDevAttr; /* Device attributes */
WORD wCylinders; /* Number of cylinders */
BYTE bMediaType; /* Media type */
/* Beginning of BIOS parameter block (BPB) */
WORD wBytesPerSec; /* Bytes per sector */
BYTE bSecPerClust; /* Sectors per cluster */
WORD wResSectors; /* Number of reserved sectors */
BYTE bFATs; /* Number of FATs */
WORD wRootDirEnts; /* Number of root-directory entries */
WORD wSectors; /* Total number of sectors */
BYTE bMedia; /* Media descriptor */
WORD wFATsecs; /* Number of sectors per FAT */
WORD wSecPerTrack; /* Number of sectors per track */
WORD wHeads; /* Number of heads */
DWORD dwHiddenSecs; /* Number of hidden sectors */
DWORD dwHugeSectors; /* Number of sectors if wSectors == 0 */
/* End of BIOS parameter block (BPB) */
} DEVICEPARAMS, FAR * LPDEVICEPARAMS;
/* Function prototypes */
BOOL GetDeviceParameters (int nDrive, LPDEVICEPARAMS dp);
BOOL IsCDRomDrive (int nDrive);
/*----------------------------------------------------------------- */
/* GetDeviceParameters() */
/* */
/* Fills a DEVICEPARAMS struct with info about the given drive. */
/* Calls DOS IOCTL Get Device Parameters (440Dh, 60h) function. */
/* */
/* Parameters */
/* nDrive Drive number 0 = A, 1 = B, 2 = C, and so on. */
/* dp Pointer to a structure that will contain the drive's */
/* parameters. */
/* */
/* Returns TRUE if it succeeded, FALSE if it failed. */
/*----------------------------------------------------------------- */
#pragma warning(disable:4704) /* in-line asm precludes global optimizations */
BOOL GetDeviceParameters (int nDrive, LPDEVICEPARAMS dp)
{
BOOL bResult = TRUE; /* Assume success */
__asm {
push ds
mov bx, nDrive
inc bx /* Convert 0-based #'s to 1-based #s */
mov ch, 08h /* Device category--must be 08h */
mov cl, 60h /* MS-DOS IOCTL Get Device Parameters */
lds dx, dp
mov ax, 440Dh
int 21h
jnc gdp_done /* CF SET if error */
mov bResult, FALSE
gdp_done:
pop ds
}
return (bResult);
}
#pragma warning(default:4704) /* in-line asm precludes global optimizations */
/*----------------------------------------------------------------- */
/* IsCDRomDrive() */
/* */
/* Determines if a drive is a CD-ROM. Calls MSCDEX and checks */
/* that MSCDEX is loaded, and that MSCDEX reports the drive is a */
/* CD-ROM. */
/* */
/* Parameters */
/* nDrive Drive number 0 = A, 1 = B, 2 = C, and so forth. */
/* */
/* Returns TRUE if nDrive is a CD-ROM drive, FALSE if it isn't. */
/*----------------------------------------------------------------- */
#pragma warning(disable:4704) /* in-line asm precludes global optimizations */
BOOL IsCDRomDrive (int nDrive)
{
BOOL bResult = FALSE; /* Assume not a CD-ROM drive */
__asm {
mov ax, 150Bh /* MSCDEX CD-ROM Drive Check */
xor bx, bx
mov cx, nDrive
int 2Fh
cmp bx, 0ADADh /* Check MSCDEX signature */
jne not_cd_drive
or ax, ax /* Check the drive type */
jz not_cd_drive /* 0 (zero) means not CD-ROM */
mov bResult, TRUE
not_cd_drive:
}
return (bResult);
}
#pragma warning(default:4704) /* in-line asm precludes global optimizations */
#endif
/*----------------------------------------------------------------- */
/* GetDriveTypeEx() */
/* */
/* Determines the type of a drive. Calls Windows's GetDriveType */
/* to determine if a drive is valid, fixed, remote, or removeable, */
/* then breaks down these categories further to specific device */
/* types. */
/* */
/* Parameters */
/* nDrive Drive number 0 = A, 1 = B, 2 = C, etc. */
/* */
/* Returns one of: */
/* EX_DRIVE_INVALID -- Drive not detected */
/* EX_DRIVE_REMOVABLE -- Unknown removable-media type drive */
/* EX_DRIVE_FIXED -- Hard disk drive */
/* EX_DRIVE_REMOTE -- Remote drive on a network */
/* EX_DRIVE_CDROM -- CD-ROM drive */
/* EX_DRIVE_FLOPPY -- Floppy disk drive */
/* EX_DRIVE_RAMDISK -- RAM disk */
/*----------------------------------------------------------------- */
UINT GetDriveTypeEx (int nDrive)
{
#if 0
DEVICEPARAMS dp;
UINT uType;
_fmemset (&dp, 0, sizeof(dp)); /* Init device params struct */
uType = GetDriveType (nDrive);
switch (uType)
{
case DRIVE_REMOTE:
/* GetDriveType() reports CD-ROMs as Remote drives. Need */
/* to see if the drive is a CD-ROM or a network drive. */
if (IsCDRomDrive (nDrive))
return (EX_DRIVE_CDROM);
else
return (EX_DRIVE_REMOTE);
break;
case DRIVE_REMOVABLE:
/* Check for a floppy disk drive. If it isn't, then we */
/* don't know what kind of removable media it is. */
/* For example, could be a Bernoulli box or something new... */
if (GetDeviceParameters (nDrive, &dp))
switch (dp.bDevType)
{
/* Floppy disk drive types */
case 0x0: case 0x1: case 0x2: case 0x3:
case 0x4: case 0x7: case 0x8:
return (EX_DRIVE_FLOPPY);
}
return (EX_DRIVE_REMOVABLE); /* Unknown removable media type */
break;
case DRIVE_FIXED:
/* GetDeviceParameters returns a device type of 0x05 for */
/* hard disks. Because hard disks and RAM disks are the two */
/* types of fixed-media drives, we assume that any fixed- */
/* media drive that isn't a hard disk is a RAM disk. */
if (GetDeviceParameters (nDrive, &dp) && dp.bDevType == 0x05)
return (EX_DRIVE_FIXED);
else
return (EX_DRIVE_RAMDISK);
break;
#endif
UINT uType;
CHAR achRoot[4];
achRoot[0] = 'A'+nDrive;
achRoot[1] = ':';
achRoot[2] = '\\';
achRoot[3] = 0;
uType = GetDriveTypeA (achRoot);
switch (uType)
{
case DRIVE_REMOVABLE:
return (EX_DRIVE_REMOVABLE); /* Unknown removable media type */
case DRIVE_FIXED:
return (EX_DRIVE_FIXED);
case DRIVE_REMOTE:
return (EX_DRIVE_REMOTE);
case DRIVE_CDROM:
return (EX_DRIVE_CDROM);
case DRIVE_RAMDISK:
return (EX_DRIVE_RAMDISK);
}
return (EX_DRIVE_INVALID); /* Drive is invalid if we get here. */
}