CPB Mailing List
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Directly Writing to drives
Almost a year ago I saved this message because I thought I would try direct
access someday. Well I recently got some time to mess with this but I
haven't been able to make it work.
The code below from Ashley Sutton looks good but it seems I am missing an
include file because some of the values are not defined.
Specifically
READ_WRITE
ABSDISKIO_WRITE
ABSDISKIO_READ
Does anyone know what the values for these are or know the header file I
need to include?
Better yet, does someone have an example of how to do read and write
directly to drives?
-----Original Message-----
From: Sutton, Ashley [mailto:Ashley.Sutton@olsy.co.uk]
Sent: Monday, November 17, 1997 4:06 AM
To: 'cpb-thread@zdtips.com'
Subject: RE: Writing to floppy
Craig,
This may help:
#pragma pack(push,1) // Pack structure using byte packing
typedef struct stBOOTSECTOR { // DISK IMAGE HEADER
char cJumpInstruction[3], // Jump instruction (Machine code)
cOEMNameVer[8]; // OEM Name and version number
WORD wBytePerSec; // Bytes per sector
BYTE bSecsPerCluster; // Sectors per cluster
WORD wReservedSecs; // Reserved sectors
BYTE bNoOfFATS; // Number of FATS
WORD wEntriesInRoot, // Entries in root directory
wTotalSecs; // Total sectors on disk
BYTE bMediumDescriptor; // Media Descriptor
WORD wSecsPerFAT, // Sectors per FAT
wSecsPerTrack, // Sectors per track
wNoOfHeads, // Number of heads
wReserved; // Reserved
}BOOTSECTOR, *pBOOTSECTOR;
#pragma pack(pop)
class TFile
{
HANDLE hFile;
public:
~TFile(){CloseHandle(hFile);};
TFile(){hFile = INVALID_HANDLE_VALUE;};
TFile(const char* fName, DWORD dwAccess, DWORD dwCreation, DWORD dwFlags)
{
Open(fName, dwAccess, dwCreation, dwFlags);
};
Close(void){CloseHandle(hFile);};
Open(const char* fName, DWORD dwAccess, DWORD dwCreation, DWORD dwFlags)
{ // If another file is already open then close it
if(hFile != INVALID_HANDLE_VALUE)
CloseHandle(hFile);
hFile = CreateFile(fName, dwAccess, 0, 0, dwCreation, dwFlags, 0);
if(hFile == INVALID_HANDLE_VALUE){
switch(dwCreation){
case OPEN_EXISTING :
switch(dwAccess){
case READ_WRITE:
throw "Error opening file for updating.";
case GENERIC_READ:
throw "Error opening file for reading.";
case GENERIC_WRITE:
throw "Error opening file for writing.";
default:
throw "Error opening file.";
}
case CREATE_NEW :
switch(dwAccess) {
case GENERIC_WRITE:
default:
throw "Error creating new file.";
}
}
}
};
operator HANDLE()
{
if(hFile == INVALID_HANDLE_VALUE)
throw "File handle not initialised.";
else
return hFile;
};
};
//----------------------------------------------------------------------------
bool AbsDiskIO(char *cBuffer, WORD iFrom, WORD iSectors, BYTE bOp)
{
bool blStatus = false; // Status: ERROR = false, OK = true
DWORD cb; // Number of bytes returned by DeviceIoControl
DIOC_REGISTERS reg; // Register structure used in DeviceIoControl call
TFile hFile; // File handle
// Windows 95 and Operation either READ or WRITE?
if((int)GetVersion() < 0 &&
(bOp == ABSDISKIO_WRITE || bOp == ABSDISKIO_READ)){
// YES: Open device driver
hFile.Open("\\\\.\\VWIN32",READ_WRITE,0,FILE_FLAG_DELETE_ON_CLOSE);
// OK: Read/Write sectors information. Make upto 3 attempts if unsucessful
for(int i = 3 ; blStatus == false && i > 0; i--){
reg.reg_EAX = 0x0000; // AX = Drive A:
reg.reg_EBX = (DWORD)cBuffer; // Buffer Address
reg.reg_ECX = iSectors; // Number of sectors
reg.reg_EDX = iFrom; // Starting at sector
reg.reg_Flags = CARRY_FLAG; // Assume failure
blStatus = (DeviceIoControl(hFile,bOp, ®,sizeof(reg), ®,sizeof(reg),&cb,0)
&& !(reg.reg_Flags &CARRY_FLAG));
}
}
return(blStatus);
}
//----------------------------------------------------------------------------
bool GetFloppyBootSector(pBOOTSECTOR pBootSector)
{
bool blStatus; // Status: ERROR = false, OK = true
char cBuffer[512]; // Temporary Buffer
// Read Boot Sector and save if OK
if(blStatus = AbsDiskIO(cBuffer, 0, 1, ABSDISKIO_READ))
memcpy((char *)pBootSector, cBuffer, sizeof(BOOTSECTOR));
return(blStatus);
}
//----------------------------------------------------------------------------
char *GetFloppyType(pBOOTSECTOR stBootSector)
{ // Return floppy media type
switch(stBootSector->bMediumDescriptor){
case 0xF0 : return("1.44Mb");
case 0xF8 : return("Fixed Disk");
case 0xF9 : return(stBootSector->wSecsPerTrack == 9 ? "720K" :
"1.2Mb");
case 0xFC : return("180K");
case 0xFD : return("360K");
case 0xFE : return("160K");
case 0xFF : return("320K");
default : return("Unknown");
}
}
Note:
The TFile class is used to ensure that if an exception occurs during
file handling the exception will cause the destructor for TFile to be
called which will ensure that the handle is closed. By using the
operator HANDLE() the instance can be used as if it were a normal
handle. This class also ensure that if the handle is used to open up
another file the old handle is first closed.
Regards, Ashley
>-----Original Message-----
>From: Craig Plecas [SMTP:cplecas@evi-inc.com]
>Sent: 13 November 1997 22:32
>To: cpb-thread@zdtips.com
>Subject: Re: Writing to floppy
>
>
>
>I was able to do writes to physical sectors on the floppy using the
>DeviceIOControl function with VWIN32_DIOC_DOS_INT13 (4) as the control
>code. There is also a code to use INT 25H to write a sector.
>
>----------
>From: David <perfectpc@worldnet.att.net>
>To: 'cpb-thread@zdtips.com'
>Subject: RE: Writing to floppy
>Date: Wednesday, November 12, 1997 8:11 PM
>
>There seem to be some obscure commands in the WIN32 Reference help file.
>(I have also wanted to be able to do this.)
>I currently have to go through a lot of trouble to get data off flash
>memory cards because I can't access the sectors directly. (I could do
>direct writes/reads easily in an earlier DOS version of the program.)
>
>I guess Microsoft is trying to move us away from low level manipulation.
>
>Perhaps the way to do it under 95/NT is to write a device driver. (Oh
>good! Another learning curve.;)
>
>
>
>----------
>From: Craig Plecas[SMTP:cplecas@evi-inc.com]
>Sent: Tuesday, November 04, 1997 12:25 PM
>To: CPB List
>Subject: Writing to floppy
>
>I wish to write to specific sectors on the floppy from within my win95 app.
> On a whim I tried to include dos.h and use BIOS interrupt INT 13H,
>function 3 to no avail. Does anyone know of any Windows functions that can
>be called to perform this task? Any guidance would be greatly appreciated.
>
>Thanx,
>Craig Plecas
>EVI, Inc.
>cplecas@evi-inc.com
>
>----------
W Komornicki's Home Page |
Main Index |
Thread Index