/* ** isRamDsk() - Determine if a drive is a RAM disk ** ** Call with drive letter ('a' - 'z', 'A' - 'Z') ** ** Returns TRUE, FALSE, or ERROR ** ** Uses ABSDISKC.C, ABSDISK.ASM, and DOS5BOOT.H from SNIPPETS ** (Note: The relevent parts of the structure in DOS5BOOT.H are ** also applicable to lower version numbers of DOS) ** ** Public domain by Bob Stout */ #include #include #include #include "dos5boot.h" int AbsDiskRead(unsigned short, size_t, size_t, void *); typedef enum {ERROR = -1, FALSE, TRUE} LOGICAL; LOGICAL isRamDsk(unsigned char drive) { union REGS regs; B_REC buffer; regs.x.ax = 0x4408; /* Not if removable */ regs.h.bl = (unsigned)toupper(drive) - (unsigned char)'@'; intdos(®s, ®s); if (0 == regs.x.ax) return FALSE; if (AbsDiskRead(toupper(drive) - 'A', 1, 0, &buffer)) return ERROR; return (1 == buffer.bsFATs); } #ifdef TEST #include #include int main(int argc, char *argv[]) { if (2 > argc) { puts("Syntax: ISRAMDSK drive_letter"); return EXIT_FAILURE; } printf("Drive %c: is%s a RAM drive\n", toupper(*argv[1]), isRamDsk(*argv[1]) ? "" : " not"); return EXIT_SUCCESS; } #endif /* TEST */