diff options
Diffstat (limited to 'private/windows/diamond/dmftools/dmffmt/dmffmt.c')
-rw-r--r-- | private/windows/diamond/dmftools/dmffmt/dmffmt.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/private/windows/diamond/dmftools/dmffmt/dmffmt.c b/private/windows/diamond/dmftools/dmffmt/dmffmt.c new file mode 100644 index 000000000..11a4a8d5f --- /dev/null +++ b/private/windows/diamond/dmftools/dmffmt/dmffmt.c @@ -0,0 +1,199 @@ +#include <windows.h> +#include <winioctl.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +typedef struct _BOOT_SECTOR_ZERO { + UCHAR IntelNearJumpCommand[1]; + UCHAR BootStrapJumpOffset[2]; + UCHAR OemData[8]; + UCHAR BytesPerSector[2]; + UCHAR SectorsPerCluster[1]; + UCHAR ReservedSectors[2]; + UCHAR Fats[1]; + UCHAR RootEntries[2]; + UCHAR Sectors[2]; + UCHAR Media[1]; + UCHAR SectorsPerFat[2]; + UCHAR SectorsPerTrack[2]; + UCHAR Heads[2]; + UCHAR HiddenSectors[4]; + UCHAR LargeSectors[4]; + UCHAR PhysicalDrive[1]; + UCHAR CurrentHead[1]; + UCHAR Signature[1]; + UCHAR SerialNumber[4]; + UCHAR Label[11]; + UCHAR SystemIdText[8]; +} *PBOOT_SECTOR; + +int +_cdecl +main( + int argc, + char** argv + ) + +/*++ + +Routine Description: + + This routine implements a DMF format. It lays down the BPB and everything. + +Arguments: + + argc - Supplies the number of command line arguments. + + argv - Supplies the command line arguments. + +Return Value: + + 0 - Success. + + 1 - Failure. + +--*/ + +{ +#define FORMAT_PARAMETERS_SIZE (sizeof(FORMAT_EX_PARAMETERS) + 20*sizeof(USHORT)) + + CHAR drive[20]; + HANDLE handle; + CHAR formatParametersBuffer[FORMAT_PARAMETERS_SIZE]; + PFORMAT_EX_PARAMETERS formatParameters; + ULONG i, next; + BOOL b; + PUCHAR trackBuffer; + ULONG trackSize; + PBOOT_SECTOR bootSector; + DWORD bytesWritten; + USHORT swapBuffer[3]; + + // First make sure that we have at least one parameter. + + if (argc < 2) { + printf("usage: %s drive:\n", argv[0]); + return(1); + } + + + // Open the drive for exclusive access. + + sprintf(drive, "\\\\.\\%s", argv[1]); + handle = CreateFile(drive, GENERIC_READ | GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, 0, NULL); + if (handle == INVALID_HANDLE_VALUE) { + printf("can't open drive %s, error = %d\n", argv[1], GetLastError()); + return(1); + } + + + // Prepare the format parameters. + + formatParameters = (PFORMAT_EX_PARAMETERS) formatParametersBuffer; + formatParameters->MediaType = F3_1Pt44_512; + formatParameters->FormatGapLength = 8; + formatParameters->SectorsPerTrack = 21; + + next = 0; + for (i = 0; i < formatParameters->SectorsPerTrack; i += 2) { + formatParameters->SectorNumber[i] = (USHORT) (i/2 + 1); + next++; + } + + for (i = 1; i < formatParameters->SectorsPerTrack; i += 2) { + formatParameters->SectorNumber[i] = (USHORT) (i/2 + next + 1); + } + + // Start off by putting the boot sector as the last sector of + // the first track. + + MoveMemory(&formatParameters->SectorNumber[0], + &formatParameters->SectorNumber[1], + 20*sizeof(USHORT)); + formatParameters->SectorNumber[20] = 1; + + + // Format each track on the floppy. + + for (i = 0; i < 80; i++) { + + formatParameters->StartCylinderNumber = + formatParameters->EndCylinderNumber = i; + formatParameters->StartHeadNumber = 0; + formatParameters->EndHeadNumber = 1; + + printf("Formatting track %d\r", i); + + b = DeviceIoControl(handle, IOCTL_DISK_FORMAT_TRACKS_EX, + formatParameters, FORMAT_PARAMETERS_SIZE, + NULL, 0, &bytesWritten, NULL); + + if (!b) { + printf("Could not format track %d, error = %d\n", i, GetLastError()); + return(1); + } + + + // Skew the next cylinder by 3 sectors from this one. + + MoveMemory(swapBuffer, + &formatParameters->SectorNumber[18], + 3*sizeof(USHORT)); + MoveMemory(&formatParameters->SectorNumber[3], + &formatParameters->SectorNumber[0], + 18*sizeof(USHORT)); + MoveMemory(&formatParameters->SectorNumber[0], + swapBuffer, + 3*sizeof(USHORT)); + + } + + + // Write out the boot sector, the FAT, and the root directory. + + trackSize = formatParameters->SectorsPerTrack*512; + trackBuffer = LocalAlloc(LMEM_FIXED, trackSize + 0x1FF); + trackBuffer = (PUCHAR) (((ULONG) (trackBuffer + 0x1FF))&(~0x1FF)); + ZeroMemory(trackBuffer, trackSize); + bootSector = (PBOOT_SECTOR) trackBuffer; + + bootSector->IntelNearJumpCommand[0] = 0xeb; + bootSector->BootStrapJumpOffset[0] = 0x3e; + bootSector->BootStrapJumpOffset[1] = 0x90; + CopyMemory(bootSector->OemData, "NSDMF3.2", 8); + bootSector->BytesPerSector[1] = 2; + bootSector->SectorsPerCluster[0] = 4; + bootSector->ReservedSectors[0] = 1; + bootSector->Fats[0] = 2; + bootSector->RootEntries[0] = 0x10; + bootSector->Sectors[0] = 0x20; + bootSector->Sectors[1] = 0xd; + bootSector->Media[0] = 0xf0; + bootSector->SectorsPerFat[0] = 3; + bootSector->SectorsPerTrack[0] = 0x15; + bootSector->Heads[0] = 2; + bootSector->Signature[0] = 0x29; + CopyMemory(bootSector->Label, "NO NAME ", 11); + CopyMemory(bootSector->SystemIdText, "FAT12 ", 8); + + trackBuffer[0x1fe] = 0x55; + trackBuffer[0x1ff] = 0xAA; + trackBuffer[0x200] = 0xF0; + trackBuffer[0x201] = 0xFF; + trackBuffer[0x202] = 0xFF; + trackBuffer[0x800] = 0xF0; + trackBuffer[0x801] = 0xFF; + trackBuffer[0x802] = 0xFF; + + b = WriteFile(handle, trackBuffer, trackSize, &bytesWritten, NULL); + if (!b || trackSize != bytesWritten) { + printf("Track 0 write failed with %d\n", GetLastError()); + return(1); + } + + CloseHandle(handle); + + return(0); +} |