diff --git a/reactos/ntoskrnl/tst/test.c b/reactos/ntoskrnl/tst/test.c index 1f950d25c19..5ac3209c3d3 100644 --- a/reactos/ntoskrnl/tst/test.c +++ b/reactos/ntoskrnl/tst/test.c @@ -25,14 +25,12 @@ static KEVENT event = {}; //static KEVENT event2; /* FUNCTIONS ****************************************************************/ - +/* NTSTATUS TstPlaySound(void) { HANDLE hfile; - /* - * Open the parallel port - */ +// * Open the parallel port printk("Opening Waveout\n"); // hfile = CreateFile("\\Device\\WaveOut",0,0,0,0,0,0); if (hfile == NULL) @@ -107,7 +105,7 @@ void TstGeneralWrite() 0, 0); } - +/* void TstParallelPortWrite() { HANDLE hfile; @@ -119,7 +117,7 @@ void TstParallelPortWrite() DbgPrint("Failed to open parallel port\n"); } // WriteFile(hfile,"hello world",strlen("hello world"),NULL,NULL); - } +} void TstKeyboardRead() { @@ -154,13 +152,228 @@ void TstKeyboardRead() // DbgPrint("%c",key[1].AsciiChar); } } +*/ +/* IDE TEST STUFF ***********************************************************/ +typedef struct _BOOT_PARAMETERS { + WORD BytesBerSector; + BYTE SectorsPerAllocationUnit; + WORD ReservedSectorCount; + BYTE FATCount; + WORD RootDirEntryCount; + WORD TotalSectorCount; + BYTE MediaDescriptor; + WORD SectorsPerFAT; + WORD SectorsPerTrack; + WORD HeadCount; + DWORD HiddenSectorCount; + DWORD TotalSectorsInLogicalVolume; +} __attribute__ ((packed)) BOOT_PARAMETERS, __attribute__ ((packed)) *PBOOT_PARAMETERS; +typedef struct _BOOT_BLOCK { + char JumpInstruction[3]; + char OEMName[8]; + BOOT_PARAMETERS BootParameters; + BYTE DriveNumber; + BYTE Reserved1; + BYTE ExtBootSignatureRecord; + DWORD BinaryVolumeID; + char VolumeLabel[11]; + char Reserved2[8]; + char Bootstrap[512 - 61]; +} __attribute__ ((packed)) BOOT_BLOCK, __attribute__ ((packed)) *PBOOT_BLOCK; + +typedef struct _ROOT_DIR_ENTRY { + char Filename[8]; + char Extension[3]; + char FileAttribute; + char Reserved1[10]; + WORD ModifiedTime; + WORD ModifiedDate; + WORD StartingCluster; + DWORD FileSize; +} __attribute__ ((packed)) ROOT_DIR_ENTRY; + +#define ENTRIES_PER_BLOCK (512 / sizeof(ROOT_DIR_ENTRY)) + +void TstIDERead(void) +{ + BOOLEAN TestFailed; + int Entry, i; + HANDLE FileHandle; + NTSTATUS Status; + LARGE_INTEGER BlockOffset; + ANSI_STRING AnsiDeviceName; + UNICODE_STRING UnicodeDeviceName; + OBJECT_ATTRIBUTES ObjectAttributes; + char SectorBuffer[512]; + PBOOT_BLOCK BootBlock; + ROOT_DIR_ENTRY DirectoryBlock[ENTRIES_PER_BLOCK]; + + DbgPrint("IDE Read Test\n"); + TestFailed = FALSE; + + /* open the first partition */ + DbgPrint("Opening Partition1\n"); + RtlInitAnsiString(&AnsiDeviceName, "\\Device\\HardDrive0\\Partition0"); + RtlAnsiStringToUnicodeString(&UnicodeDeviceName, &AnsiDeviceName, TRUE); + InitializeObjectAttributes(&ObjectAttributes, + &UnicodeDeviceName, + 0, + NULL, + NULL); + Status = ZwOpenFile(&FileHandle, 0, &ObjectAttributes, NULL, 0, 0); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Failed to open partition1\n"); + TestFailed = TRUE; + } + + /* Read the boot block */ + if (!TestFailed) + { + DbgPrint("Reading boot block from Partition1\n"); + RtlZeroMemory(SectorBuffer, sizeof(SectorBuffer)); +DbgPrint("addr %x\n", SectorBuffer); + Status = ZwReadFile(FileHandle, + NULL, + NULL, + NULL, + NULL, + SectorBuffer, + sizeof(SectorBuffer), + 0, + 0); + if (Status != STATUS_SUCCESS /* !NT_SUCCESS(Status) */) + { + DbgPrint("Failed to read book block from partition1 status:%x\n", Status); + TestFailed = TRUE; + } + } + + /* %%% Check for valid boot block signature */ + + /* Spew info about boot block */ + if (!TestFailed) + { + + for (i = 0; i < 64; i++) + { + if (!(i % 16)) + { + DbgPrint("\n%04d: ", i); + } + DbgPrint("%02x ", (unsigned char)SectorBuffer[i]); + } + DbgPrint("\n"); + + BootBlock = (PBOOT_BLOCK) SectorBuffer; + DbgPrint("boot block on Partition1:\n"); + DbgPrint(" OEM Name: %.8s Bytes/Sector:%d Sectors/Cluster:%d\n", + BootBlock->OEMName, + BootBlock->BootParameters.BytesBerSector, + BootBlock->BootParameters.SectorsPerAllocationUnit); + DbgPrint(" ReservedSectors:%d FATs:%d RootDirEntries:%d\n", + BootBlock->BootParameters.ReservedSectorCount, + BootBlock->BootParameters.FATCount, + BootBlock->BootParameters.RootDirEntryCount); + DbgPrint(" TotalSectors:%d MediaDescriptor:%d Sectors/FAT:%d\n", + BootBlock->BootParameters.TotalSectorCount, + BootBlock->BootParameters.MediaDescriptor, + BootBlock->BootParameters.SectorsPerFAT); + DbgPrint(" Sectors/Track:%d Heads:%d HiddenSectors:%d\n", + BootBlock->BootParameters.SectorsPerTrack, + BootBlock->BootParameters.HeadCount, + BootBlock->BootParameters.HiddenSectorCount); + DbgPrint(" VolumeLabel:%.11s\n", BootBlock->VolumeLabel); + } +for(;;); + + /* Read the first root directory block */ + if (!TestFailed) + { + DbgPrint("Reading rootdir block from Partition1\n"); + BlockOffset.HighPart = 0; + BlockOffset.LowPart = BootBlock->BootParameters.ReservedSectorCount * 512 + + BootBlock->BootParameters.FATCount * + BootBlock->BootParameters.SectorsPerFAT * 512; + Status = ZwReadFile(FileHandle, + NULL, + NULL, + NULL, + NULL, + DirectoryBlock, + sizeof(DirectoryBlock), + &BlockOffset, + 0); + if (Status != STATUS_SUCCESS /* !NT_SUCCESS(Status) */) + { + DbgPrint("Failed to read root directory block from partition1\n"); + TestFailed = TRUE; + } + } + + /* Print the contents */ + if (!TestFailed) + { + for (Entry = 0; Entry < ENTRIES_PER_BLOCK; Entry++) + { + switch (DirectoryBlock[Entry].Filename[0]) + { + case 0x00: + DbgPrint("End of Directory.\n"); + Entry = ENTRIES_PER_BLOCK; + break; + + case 0x05: + DbgPrint(" FILE: %c%.7s.%.3s ATTR:%x Time:%04x Date:%04x offset:%d size:%d\n", + 0xe5, + &DirectoryBlock[Entry].Filename[1], + DirectoryBlock[Entry].Extension, + DirectoryBlock[Entry].FileAttribute, + DirectoryBlock[Entry].ModifiedTime, + DirectoryBlock[Entry].ModifiedDate, + DirectoryBlock[Entry].StartingCluster, + DirectoryBlock[Entry].FileSize); + break; + + case 0x2e: + DbgPrint(" ALIAS: %.8s ATTR:%x Time:%04x Date:%04x offset:%d size:%d\n", + &DirectoryBlock[Entry].Filename[1], + DirectoryBlock[Entry].FileAttribute, + DirectoryBlock[Entry].ModifiedTime, + DirectoryBlock[Entry].ModifiedDate, + DirectoryBlock[Entry].StartingCluster, + DirectoryBlock[Entry].FileSize); + break; + + case 0xe5: + break; + + default: + DbgPrint(" FILE: %.8s.%.3s ATTR:%x Time:%04x Date:%04x offset:%d size:%d\n", + &DirectoryBlock[Entry].Filename[1], + DirectoryBlock[Entry].Extension, + DirectoryBlock[Entry].FileAttribute, + DirectoryBlock[Entry].ModifiedTime, + DirectoryBlock[Entry].ModifiedDate, + DirectoryBlock[Entry].StartingCluster, + DirectoryBlock[Entry].FileSize); + break; + } + } + } + if (FileHandle != NULL) + { + ZwClose(FileHandle); + } +} void TstBegin() { // TstGeneralWrite(); // TstThreadSupport(); - TstKeyboardRead(); +// TstKeyboardRead(); + TstIDERead(); }