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, &reg,sizeof(reg), &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