55 #define VHD_TIMESTAMP_BASE 946684800 115 ULONG cyls_times_heads;
117 if (total_sectors > 65535 * 16 * 255)
120 if (total_sectors > 65535 * 16 * 63)
124 cyls_times_heads = total_sectors / *secs_per_cyl;
129 cyls_times_heads = total_sectors / *secs_per_cyl;
130 *
heads = (cyls_times_heads + 1023) / 1024;
135 if (cyls_times_heads >= (*
heads * 1024) || *
heads > 16)
139 cyls_times_heads = total_sectors / *secs_per_cyl;
142 if (cyls_times_heads >= (*
heads * 1024))
146 cyls_times_heads = total_sectors / *secs_per_cyl;
150 *cyls = cyls_times_heads / *
heads;
179 { 200, 10, 1, 40, 0},
182 { 400, 10, 2, 40, 1},
184 {1200, 15, 2, 80, 2},
185 {1440, 18, 2, 80, 4},
186 {2880, 36, 2, 80, 6},
227 DiskImage->hDisk =
hFile;
250 DWORD FilePointer, BytesToRead;
277 if (vhd_footer.
version != 0x00000100 &&
278 vhd_footer.
version != 0x00000500)
290 DisplayMessage(
L"MountHDD: Unexpected data offset for VHD HDD fixed image.");
295 DisplayMessage(
L"MountHDD: VHD HDD fixed image size should be the same as its original size.");
301 DiskImage->DiskType = 0;
303 DiskImage->DiskInfo.Heads = vhd_footer.
heads;
306 DiskImage->DiskInfo.Cylinders /
307 DiskImage->DiskInfo.Heads / DiskImage->DiskInfo.Sectors;
312 DiskImage->hDisk =
hFile;
345 FilePointer = (
DWORD)((
DWORD)((
DWORD)Cylinder * DiskImage->DiskInfo.Heads + Head)
346 * DiskImage->DiskInfo.Sectors + (Sector - 1))
347 * DiskImage->DiskInfo.SectorSize;
369 BYTE StaticBuffer[1024];
376 BytesToRead = (
DWORD)NumSectors * DiskImage->DiskInfo.SectorSize;
380 if (BytesToRead <=
sizeof(StaticBuffer))
382 LocalBuffer = StaticBuffer;
390 if (
ReadFile(DiskImage->hDisk, LocalBuffer, BytesToRead, &BytesToRead,
NULL))
405 if (LocalBuffer != StaticBuffer)
423 BYTE StaticBuffer[1024];
426 if (DiskImage->ReadOnly)
437 BytesToWrite = (
DWORD)NumSectors * DiskImage->DiskInfo.SectorSize;
441 if (BytesToWrite <=
sizeof(StaticBuffer))
443 LocalBuffer = StaticBuffer;
457 if (
WriteFile(DiskImage->hDisk, LocalBuffer, BytesToWrite, &BytesToWrite,
NULL))
462 if (LocalBuffer != StaticBuffer)
492 DisplayMessage(
L"RetrieveDisk: Disk number %d:%d invalid.", DiskType, DiskNumber);
515 DisplayMessage(
L"MountDisk: Disk number %d:%d invalid.", DiskType, DiskNumber);
522 DPRINT1(
"MountDisk: Disk %d:%d:0x%p already in use, recycling...\n", DiskType, DiskNumber, DiskImage);
535 DPRINT1(
"File '%S' opening %s ; GetLastError() = %u\n",
598 DisplayMessage(
L"UnmountDisk: Disk number %d:%d invalid.", DiskType, DiskNumber);
605 DPRINT1(
"UnmountDisk: Disk %d:%d:0x%p is already unmounted\n", DiskType, DiskNumber, DiskImage);
BYTE WriteDisk(IN PDISK_IMAGE DiskImage, IN WORD Cylinder, IN BYTE Head, IN BYTE Sector, IN BYTE NumSectors)
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
USHORT WINAPI getBX(VOID)
#define RtlUlonglongByteSwap(_x)
#define ERROR_INVALID_FUNCTION
#define RtlUshortByteSwap(_x)
static DISK_GEO DiskGeometryList[]
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
static WORD HackSectorSize
BOOLEAN IsDiskPresent(IN PDISK_IMAGE DiskImage)
static OUT PIO_STATUS_BLOCK OUT PVOID FileInformation
#define INVALID_HANDLE_VALUE
DWORD WINAPI GetLastError(VOID)
VOID FASTCALL EmulatorWriteMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size)
BOOLEAN DiskCtrlInitialize(VOID)
#define INVALID_FILE_SIZE
VOID FileClose(IN HANDLE FileHandle)
static DISK_IMAGE XDCFloppyDrive[4]
BYTE ReadDisk(IN PDISK_IMAGE DiskImage, IN WORD Cylinder, IN BYTE Head, IN BYTE Sector, IN BYTE NumSectors)
static BOOLEAN MountFDI(IN PDISK_IMAGE DiskImage, IN HANDLE hFile)
MOUNT_DISK_HANDLER MountDiskHelper
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
C_ASSERT(sizeof(VHD_FOOTER)==0x200)
struct _VHD_FOOTER * PVHD_FOOTER
BOOL WINAPI FlushFileBuffers(IN HANDLE hFile)
BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
USHORT WINAPI getES(VOID)
enum _DISK_TYPE DISK_TYPE
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
#define TO_LINEAR(seg, off)
#define FILE_ATTRIBUTE_NORMAL
_Must_inspect_result_ _Out_ PLARGE_INTEGER FileSize
struct _VHD_FOOTER VHD_FOOTER
#define RtlUlongByteSwap(_x)
struct _DISK_GEO * PDISK_GEO
static BOOLEAN MountHDD(IN PDISK_IMAGE DiskImage, IN HANDLE hFile)
BOOLEAN MountDisk(IN DISK_TYPE DiskType, IN ULONG DiskNumber, IN PCWSTR FileName, IN BOOLEAN ReadOnly)
#define INVALID_SET_FILE_POINTER
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define ReadFile(a, b, c, d, e)
BOOLEAN UnmountDisk(IN DISK_TYPE DiskType, IN ULONG DiskNumber)
PDISK_IMAGE RetrieveDisk(IN DISK_TYPE DiskType, IN ULONG DiskNumber)
BYTE SeekDisk(IN PDISK_IMAGE DiskImage, IN WORD Cylinder, IN BYTE Head, IN BYTE Sector)
FAST486_STATE EmulatorContext
struct _DISK_MOUNT_INFO * PDISK_MOUNT_INFO
struct _DISK_MOUNT_INFO DISK_MOUNT_INFO
VOID DiskCtrlCleanup(VOID)
void DisplayMessage(BOOL bConsole, BOOL bSilent, LPCTSTR lpMessage, LPCTSTR lpTitle, UINT uType)
static DISK_MOUNT_INFO DiskMountInfo[MAX_DISK_TYPE]
static DISK_IMAGE XDCHardDrive[4]
BOOLEAN(* MOUNT_DISK_HANDLER)(IN PDISK_IMAGE DiskImage, IN HANDLE hFile)
#define RtlCompareMemory(s1, s2, l)
VOID FASTCALL EmulatorReadMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size)
struct _DISK_GEO DISK_GEO