From f3e681947146fcb7e0c0c36a7cf64b6ab55cc72d Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 30 Jun 2000 22:53:32 +0000 Subject: [PATCH] Added hal dispatch tables. Implemented PhysicalDrive links. Started drive letter assignment. svn path=/trunk/; revision=1214 --- reactos/include/ddk/halddk.h | 220 ++++++++++++++++++++++- reactos/include/ddk/iofuncs.h | 154 +++------------- reactos/include/ddk/ketypes.h | 61 +++++-- reactos/include/ddk/ntddk.h | 17 +- reactos/include/ntos/disk.h | 54 +++--- reactos/ntoskrnl/hal/x86/drive.c | 23 ++- reactos/ntoskrnl/hal/x86/parttab.c | 20 +-- reactos/ntoskrnl/include/internal/xhal.h | 22 +++ reactos/ntoskrnl/io/xhaldisp.c | 48 +++++ reactos/ntoskrnl/io/xhaldrv.c | 193 ++++++++++++++++++++ reactos/ntoskrnl/ke/main.c | 11 +- reactos/ntoskrnl/makefile_rex | 6 +- reactos/ntoskrnl/ntoskrnl.def | 8 +- reactos/ntoskrnl/ntoskrnl.edf | 8 +- 14 files changed, 644 insertions(+), 201 deletions(-) create mode 100644 reactos/ntoskrnl/include/internal/xhal.h create mode 100644 reactos/ntoskrnl/io/xhaldisp.c create mode 100644 reactos/ntoskrnl/io/xhaldrv.c diff --git a/reactos/include/ddk/halddk.h b/reactos/include/ddk/halddk.h index e0425975aaa..1cf1d10b3f4 100644 --- a/reactos/include/ddk/halddk.h +++ b/reactos/include/ddk/halddk.h @@ -1,4 +1,4 @@ -/* $Id: halddk.h,v 1.1 2000/06/29 23:35:11 dwelch Exp $ +/* $Id: halddk.h,v 1.2 2000/06/30 22:49:26 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -69,6 +69,224 @@ typedef struct _DEVICE_DESCRIPTION typedef BOOLEAN (*PHAL_RESET_DISPLAY_PARAMETERS)(ULONG Columns, ULONG Rows); +/* Hal dispatch table */ + +typedef enum _HAL_QUERY_INFORMATION_CLASS +{ + HalInstalledBusInformation, + HalProfileSourceInformation, + HalSystemDockInformation, + HalPowerInformation, + HalProcessorSpeedInformation, + HalCallbackInformation, + HalMapRegisterInformation, + HalMcaLogInformation, + HalFrameBufferCachingInformation, + HalDisplayBiosInformation + /* information levels >= 0x8000000 reserved for OEM use */ +} HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS; + + +typedef enum _HAL_SET_INFORMATION_CLASS +{ + HalProfileSourceInterval, + HalProfileSourceInterruptHandler, + HalMcaRegisterDriver +} HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS; + + +typedef +NTSTATUS +(*pHalQuerySystemInformation) ( + IN HAL_QUERY_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN OUT PVOID Buffer, + OUT PULONG ReturnedLength + ); + + +typedef +NTSTATUS +(*pHalSetSystemInformation) ( + IN HAL_SET_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN PVOID Buffer + ); + + +typedef +NTSTATUS +(*pHalQueryBusSlots) ( +// IN PBUS_HANDLER BusHandler, + IN PVOID BusHandler, + IN ULONG BufferSize, + OUT PULONG SlotNumbers, + OUT PULONG ReturnedLength + ); + + +/* Control codes of HalDeviceControl function */ +#define BCTL_EJECT 0x0001 +#define BCTL_QUERY_DEVICE_ID 0x0002 +#define BCTL_QUERY_DEVICE_UNIQUE_ID 0x0003 +#define BCTL_QUERY_DEVICE_CAPABILITIES 0x0004 +#define BCTL_QUERY_DEVICE_RESOURCES 0x0005 +#define BCTL_QUERY_DEVICE_RESOURCE_REQUIREMENTS 0x0006 +#define BCTL_QUERY_EJECT 0x0007 +#define BCTL_SET_LOCK 0x0008 +#define BCTL_SET_POWER 0x0009 +#define BCTL_SET_RESUME 0x000A +#define BCTL_SET_DEVICE_RESOURCES 0x000B + +/* Defines for BCTL structures */ +typedef struct +{ + BOOLEAN PowerSupported; + BOOLEAN ResumeSupported; + BOOLEAN LockSupported; + BOOLEAN EjectSupported; + BOOLEAN Removable; +} BCTL_DEVICE_CAPABILITIES, *PBCTL_DEVICE_CAPABILITIES; + + +typedef struct _DEVICE_CONTROL_CONTEXT +{ + NTSTATUS Status; +// PDEVICE_HANDLER_OBJECT DeviceHandler; + PVOID DeviceHandler; + PDEVICE_OBJECT DeviceObject; + ULONG ControlCode; + PVOID Buffer; + PULONG BufferLength; + PVOID Context; +} DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT; + + +typedef +VOID +(*PDEVICE_CONTROL_COMPLETION) ( + IN PDEVICE_CONTROL_CONTEXT ControlContext + ); + + +typedef +NTSTATUS +(*pHalDeviceControl) ( +// IN PDEVICE_HANDLER_OBJECT DeviceHandler, + IN PVOID DeviceHandler, + IN PDEVICE_OBJECT DeviceObject, + IN ULONG ControlCode, + IN OUT PVOID Buffer OPTIONAL, + IN OUT PULONG BufferLength OPTIONAL, + IN PVOID Context, + IN PDEVICE_CONTROL_COMPLETION CompletionRoutine + ); + + +typedef +VOID +(FASTCALL *pHalExamineMBR) ( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG MBRTypeIdentifier, + OUT PVOID * Buffer + ); + +typedef +VOID +(FASTCALL *pHalIoAssignDriveLetters) ( + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString + ); + +typedef +NTSTATUS +(FASTCALL *pHalIoReadPartitionTable) ( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + OUT PDRIVE_LAYOUT_INFORMATION * PartitionBuffer + ); + +typedef +NTSTATUS +(FASTCALL *pHalIoSetPartitionInformation) ( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType + ); + +typedef +NTSTATUS +(FASTCALL *pHalIoWritePartitionTable) ( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer + ); + +typedef +//PBUS_HANDLER +PVOID +(FASTCALL *pHalHandlerForBus) ( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber + ); + +typedef +VOID +(FASTCALL *pHalReferenceBusHandler) ( +// IN PBUS_HANDLER BusHandler + IN PVOID BusHandler + ); + +typedef struct _HAL_DISPATCH +{ + ULONG Version; + pHalQuerySystemInformation HalQuerySystemInformation; + pHalSetSystemInformation HalSetSystemInformation; + pHalQueryBusSlots HalQueryBusSlots; + pHalDeviceControl HalDeviceControl; + pHalExamineMBR HalExamineMBR; + pHalIoAssignDriveLetters HalIoAssignDriveLetters; + pHalIoReadPartitionTable HalIoReadPartitionTable; + pHalIoSetPartitionInformation HalIoSetPartitionInformation; + pHalIoWritePartitionTable HalIoWritePartitionTable; + pHalHandlerForBus HalReferenceHandlerForBus; + pHalReferenceBusHandler HalReferenceBusHandler; + pHalReferenceBusHandler HalDereferenceBusHandler; +} HAL_DISPATCH, *PHAL_DISPATCH; + +#define HAL_DISPATCH_VERSION 1 + +#ifdef __NTOSKRNL__ +extern HAL_DISPATCH EXPORTED HalDispatchTable; +#else +extern HAL_DISPATCH IMPORTED HalDispatchTable; +#endif + + +/* Hal private dispatch table */ + +typedef struct _HAL_PRIVATE_DISPATCH +{ + ULONG Version; + + +} HAL_PRIVATE_DISPATCH, *PHAL_PRIVATE_DISPATCH; + +#define HAL_PRIVATE_DISPATCH_VERSION 1 + +#ifdef __NTOSKRNL__ +extern HAL_PRIVATE_DISPATCH EXPORTED HalPrivateDispatchTable; +#else +extern HAL_PRIVATE_DISPATCH IMPORTED HalPrivateDispatchTable; +#endif + VOID STDCALL diff --git a/reactos/include/ddk/iofuncs.h b/reactos/include/ddk/iofuncs.h index 2a9409d6bac..5eb3f197d70 100644 --- a/reactos/include/ddk/iofuncs.h +++ b/reactos/include/ddk/iofuncs.h @@ -1,6 +1,6 @@ #ifndef _INCLUDE_DDK_IOFUNCS_H #define _INCLUDE_DDK_IOFUNCS_H -/* $Id: iofuncs.h,v 1.14 2000/06/13 15:50:51 ekohl Exp $ */ +/* $Id: iofuncs.h,v 1.15 2000/06/30 22:49:26 ekohl Exp $ */ /* --- EXPORTED BY NTOSKRNL --- */ @@ -1111,11 +1111,12 @@ IofCompleteRequest ( VOID STDCALL IoAssignDriveLetters ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3 + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString ); + BOOLEAN STDCALL IoFlushAdapterBuffers ( @@ -1126,11 +1127,13 @@ IoFlushAdapterBuffers ( ULONG Length, BOOLEAN WriteToDevice ); + VOID STDCALL IoFreeAdapterChannel ( PADAPTER_OBJECT AdapterObject ); + VOID STDCALL IoFreeMapRegisters ( @@ -1138,6 +1141,7 @@ IoFreeMapRegisters ( PVOID MapRegisterBase, ULONG NumberOfMapRegisters ); + PHYSICAL_ADDRESS STDCALL IoMapTransfer ( @@ -1148,14 +1152,16 @@ IoMapTransfer ( PULONG Length, BOOLEAN WriteToDevice ); + NTSTATUS STDCALL IoReadPartitionTable ( - PDEVICE_OBJECT DeviceObject, - ULONG SectorSize, - BOOLEAN ReturnedRecognizedPartitions, - struct _DRIVE_LAYOUT_INFORMATION ** PBuffer + PDEVICE_OBJECT DeviceObject, + ULONG SectorSize, + BOOLEAN ReturnedRecognizedPartitions, + PDRIVE_LAYOUT_INFORMATION * PartitionBuffer ); + NTSTATUS STDCALL IoSetPartitionInformation ( @@ -1164,21 +1170,20 @@ IoSetPartitionInformation ( ULONG PartitionNumber, ULONG PartitionType ); + NTSTATUS STDCALL IoWritePartitionTable ( - PDEVICE_OBJECT DeviceObject, - ULONG SectorSize, - ULONG SectorsPerTrack, - ULONG NumberOfHeads, - struct _DRIVE_LAYOUT_INFORMATION* PBuffer + PDEVICE_OBJECT DeviceObject, + ULONG SectorSize, + ULONG SectorsPerTrack, + ULONG NumberOfHeads, + PDRIVE_LAYOUT_INFORMATION * PartitionBuffer ); /* --- --- --- INTERNAL or REACTOS ONLY --- --- --- */ - - /* * FUNCTION: Registers the driver with WMI * ARGUMENTS: @@ -1186,120 +1191,17 @@ IoWritePartitionTable ( * Action = Action to take * RETURNS: Status (?) */ -//NTSTATUS IoWMIRegistrationControl(DeviceObject, WMIREGACTION Action); - +/* +NTSTATUS +IoWMIRegistrationControl ( + PDEVICE_OBJECT DeviceObject, + WMIREGACTION Action); +*/ -/* - * FUNCTION: Returns a pointer to the callers - * stack location in the irp - */ -/* -PIO_STACK_LOCATION -IoGetCurrentIrpStackLocation ( - IRP * irp - ); -*/ -/* -ULONG -IoGetFunctionCodeFromCtlCode ( - ULONG ControlCode - ); -*/ -/* - * FUNCTION: - */ -/* -PIO_STACK_LOCATION -IoGetNextIrpStackLocation ( - IRP * irp - ); -*/ -/* -VOID -IoInitializeDpcRequest ( - PDEVICE_OBJECT DeviceObject, - PIO_DPC_ROUTINE DpcRoutine - ); -*/ -/* -BOOLEAN -IoIsErrorUserInduced ( - NTSTATUS Status - ); -*/ BOOLEAN IoIsTotalDeviceFailure ( NTSTATUS Status ); -/* - * FUNCTION: Marks an IRP as pending - * ARGUMENTS: - * Irp = Irp to mark - * NOTE: If a driver doesn't complete the irp in its dispatch routine it - * must mark it pending otherwise the I/O manager will complete it on - * return from the dispatch routine. - */ -/* -VOID -IoMarkIrpPending ( - PIRP Irp - ); -*/ -/* -VOID -IoRequestDpc ( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - PVOID Context - ); -*/ -/* -PDRIVER_CANCEL -IoSetCancelRoutine ( - PIRP Irp, - PDRIVER_CANCEL CancelRoutine - ); -*/ -/* -VOID -IoSetCompletionRoutine ( - PIRP Irp, - PIO_COMPLETION_ROUTINE CompletionRoutine, - PVOID Context, - BOOLEAN InvokeOnSuccess, - BOOLEAN InvokeOnError, - BOOLEAN InvokeOnCancel - ); -*/ -/* -VOID -IoSetNextIrpStackLocation ( - PIRP Irp - ); -*/ -/* - * FUNCTION: Determines the size of an IRP - * ARGUMENTS: - * StackSize = number of stack locations in the IRP - * RETURNS: The size of the IRP in bytes - */ -/* -USHORT -IoSizeOfIrp ( - CCHAR StackSize - ); -*/ -#if 0 -// Preliminary guess -NTKERNELAPI -NTSTATUS -IoQueryFileVolumeInformation ( - IN PFILE_OBJECT FileObject, - IN FS_INFORMATION_CLASS FsInformationClass, - IN ULONG Length, - OUT PVOID FsInformation, - OUT PULONG ReturnedLength - ); -#endif + #endif /* ndef _INCLUDE_DDK_IOFUNCS_H */ diff --git a/reactos/include/ddk/ketypes.h b/reactos/include/ddk/ketypes.h index c3dca54647b..0367da06b77 100644 --- a/reactos/include/ddk/ketypes.h +++ b/reactos/include/ddk/ketypes.h @@ -3,17 +3,56 @@ #ifndef __INCLUDE_DDK_KETYPES_H #define __INCLUDE_DDK_KETYPES_H + +typedef struct _LOADER_PARAMETER_BLOCK +{ + /* + * Magic value (useless really) + */ + unsigned int magic; + + /* + * Cursor position + */ + unsigned int cursorx; + unsigned int cursory; + + /* + * Number of files (including the kernel) loaded + */ + unsigned int nr_files; + + /* + * Range of physical memory being used by the system + */ + unsigned int start_mem; + unsigned int end_mem; + + /* + * List of module lengths (terminated by a 0) + */ + unsigned int module_length[64]; + + /* + * Kernel parameter string + */ + char kernel_parameters[256]; + +} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK; + #ifdef __NTOSKRNL__ extern CHAR EXPORTED KeNumberProcessors; +extern LOADER_PARAMETER_BLOCK EXPORTED KeLoaderBlock; #else extern CHAR IMPORTED KeNumberProcessors; +extern LOADER_PARAMETER_BLOCK IMPORTED KeLoaderBlock; #endif struct _KMUTANT; typedef LONG KPRIORITY; - + typedef VOID (*PKBUGCHECK_CALLBACK_ROUTINE)(PVOID Buffer, ULONG Length); typedef BOOLEAN (*PKSYNCHRONIZE_ROUTINE)(PVOID SynchronizeContext); @@ -27,8 +66,8 @@ typedef VOID (*PKKERNEL_ROUTINE)(struct _KAPC* Apc, PVOID* NormalContext, PVOID* SystemArgument1, PVOID* SystemArgument2); - -typedef VOID (*PKRUNDOWN_ROUTINE)(struct _KAPC* Apc); + +typedef VOID (*PKRUNDOWN_ROUTINE)(struct _KAPC* Apc); struct _DISPATCHER_HEADER; @@ -85,10 +124,10 @@ typedef struct _KTIMER BOOLEAN signaled; BOOLEAN running; TIMER_TYPE type; - ULONG period; + ULONG period; } KTIMER, *PKTIMER; */ - + struct _KSPIN_LOCK; typedef struct _KSPIN_LOCK @@ -103,7 +142,7 @@ typedef struct _KDEVICE_QUEUE KSPIN_LOCK Lock; } KDEVICE_QUEUE, *PKDEVICE_QUEUE; - + typedef struct _KAPC { CSHORT Type; @@ -132,7 +171,7 @@ typedef struct ULONG Checksum; UCHAR State; } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD; - + typedef struct _KMUTEX { DISPATCHER_HEADER Header; @@ -141,12 +180,12 @@ typedef struct _KMUTEX BOOLEAN Abandoned; UCHAR ApcDisable; } KMUTEX, *PKMUTEX, KMUTANT, *PKMUTANT; - + typedef struct { DISPATCHER_HEADER Header; LONG Limit; -} KSEMAPHORE, *PKSEMAPHORE; +} KSEMAPHORE, *PKSEMAPHORE; typedef struct _KEVENT { @@ -177,8 +216,8 @@ typedef struct _KDPC { SHORT Type; UCHAR Number; - UCHAR Importance; - LIST_ENTRY DpcListEntry; + UCHAR Importance; + LIST_ENTRY DpcListEntry; PKDEFERRED_ROUTINE DeferredRoutine; PVOID DeferredContext; PVOID SystemArgument1; diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 336d320410c..ea500f7f9b3 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -1,4 +1,4 @@ -/* $Id: ntddk.h,v 1.14 2000/06/29 23:35:12 dwelch Exp $ +/* $Id: ntddk.h,v 1.15 2000/06/30 22:49:26 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -24,9 +24,10 @@ extern "C" #define FASTCALL STDCALL #endif -#include +#include +#include #include - + #include #include #include @@ -42,22 +43,22 @@ extern "C" #include #include #include -#include +#include #include #include - + #include #include #include #include #include #include -#include +#include #include #include #include -#include - +#include + #ifdef __cplusplus }; #endif diff --git a/reactos/include/ntos/disk.h b/reactos/include/ntos/disk.h index cad52d427ea..7cc184a0702 100644 --- a/reactos/include/ntos/disk.h +++ b/reactos/include/ntos/disk.h @@ -12,21 +12,21 @@ #ifndef __INCLUDE_DISK_H #define __INCLUDE_DISK_H -typedef enum _MEDIA_TYPE { - Unknown, - F5_1Pt2_512, - F3_1Pt44_512, - F3_2Pt88_512, - F3_20Pt8_512, - F3_720_512, - F5_360_512, - F5_320_512, - F5_320_1024, - F5_180_512, - F5_160_512, - RemovableMedia, - FixedMedia -} MEDIA_TYPE; +typedef enum _MEDIA_TYPE { + Unknown, + F5_1Pt2_512, + F3_1Pt44_512, + F3_2Pt88_512, + F3_20Pt8_512, + F3_720_512, + F5_360_512, + F5_320_512, + F5_320_1024, + F5_180_512, + F5_160_512, + RemovableMedia, + FixedMedia +} MEDIA_TYPE; typedef struct _PARTITION_INFORMATION { BYTE PartitionType; @@ -38,19 +38,19 @@ typedef struct _PARTITION_INFORMATION { LARGE_INTEGER HiddenSectors; } PARTITION_INFORMATION; -typedef struct _DRIVE_LAYOUT_INFORMATION { - DWORD PartitionCount; - DWORD Signature; - PARTITION_INFORMATION PartitionEntry[1]; -} DRIVE_LAYOUT_INFORMATION; +typedef struct _DRIVE_LAYOUT_INFORMATION { + DWORD PartitionCount; + DWORD Signature; + PARTITION_INFORMATION PartitionEntry[1]; +} DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION; -typedef struct _DISK_GEOMETRY { - LARGE_INTEGER Cylinders; - MEDIA_TYPE MediaType; - DWORD TracksPerCylinder; - DWORD SectorsPerTrack; - DWORD BytesPerSector; -} DISK_GEOMETRY ; +typedef struct _DISK_GEOMETRY { + LARGE_INTEGER Cylinders; + MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; +} DISK_GEOMETRY ; #endif /* __INCLUDE_DISK_H */ diff --git a/reactos/ntoskrnl/hal/x86/drive.c b/reactos/ntoskrnl/hal/x86/drive.c index c4267efa091..1255d7c69bf 100644 --- a/reactos/ntoskrnl/hal/x86/drive.c +++ b/reactos/ntoskrnl/hal/x86/drive.c @@ -1,4 +1,4 @@ -/* $Id: drive.c,v 1.1 2000/03/26 19:38:18 ea Exp $ +/* $Id: drive.c,v 1.2 2000/06/30 22:51:34 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -20,14 +20,23 @@ VOID STDCALL IoAssignDriveLetters ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3 + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString ) { - UNIMPLEMENTED; +#ifdef __NTOSKRNL__ + HalDispatchTable.HalIoAssignDriveLetters (LoaderBlock, + NtDeviceName, + NtSystemPath, + NtSystemPathString); +#else + HalDispatchTable->HalIoAssignDriveLetters (LoaderBlock, + NtDeviceName, + NtSystemPath, + NtSystemPathString); +#endif } - /* EOF */ diff --git a/reactos/ntoskrnl/hal/x86/parttab.c b/reactos/ntoskrnl/hal/x86/parttab.c index 968dacae9d1..3cacc272289 100644 --- a/reactos/ntoskrnl/hal/x86/parttab.c +++ b/reactos/ntoskrnl/hal/x86/parttab.c @@ -1,4 +1,4 @@ -/* $Id: parttab.c,v 1.1 2000/03/26 19:38:18 ea Exp $ +/* $Id: parttab.c,v 1.2 2000/06/30 22:51:34 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -22,10 +22,10 @@ NTSTATUS STDCALL IoReadPartitionTable ( - PDEVICE_OBJECT DeviceObject, - ULONG SectorSize, - BOOLEAN ReturnRecognizedPartitions, - struct _DRIVE_LAYOUT_INFORMATION ** PBuffer + PDEVICE_OBJECT DeviceObject, + ULONG SectorSize, + BOOLEAN ReturnRecognizedPartitions, + PDRIVE_LAYOUT_INFORMATION * PartitionBuffer ) { UNIMPLEMENTED; @@ -45,11 +45,11 @@ IoSetPartitionInformation ( NTSTATUS STDCALL IoWritePartitionTable ( - PDEVICE_OBJECT DeviceObject, - ULONG SectorSize, - ULONG SectorsPerTrack, - ULONG NumberOfHeads, - struct _DRIVE_LAYOUT_INFORMATION * PBuffer + PDEVICE_OBJECT DeviceObject, + ULONG SectorSize, + ULONG SectorsPerTrack, + ULONG NumberOfHeads, + PDRIVE_LAYOUT_INFORMATION * PBuffer ) { UNIMPLEMENTED; diff --git a/reactos/ntoskrnl/include/internal/xhal.h b/reactos/ntoskrnl/include/internal/xhal.h new file mode 100644 index 00000000000..3827262b7f7 --- /dev/null +++ b/reactos/ntoskrnl/include/internal/xhal.h @@ -0,0 +1,22 @@ +#ifndef __INCLUDE_INTERNAL_XHAL_H +#define __INCLUDE_INTERNAL_XHAL_H + +VOID +FASTCALL +xHalExamineMBR ( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG MBRTypeIdentifier, + OUT PVOID * Buffer + ); + +VOID +FASTCALL +xHalIoAssignDriveLetters ( + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString + ); + +#endif diff --git a/reactos/ntoskrnl/io/xhaldisp.c b/reactos/ntoskrnl/io/xhaldisp.c new file mode 100644 index 00000000000..0b57e2b411e --- /dev/null +++ b/reactos/ntoskrnl/io/xhaldisp.c @@ -0,0 +1,48 @@ +/* $Id: xhaldisp.c,v 1.1 2000/06/30 22:52:49 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/io/xhaldisp.c + * PURPOSE: Hal dispatch tables + * PROGRAMMER: Eric Kohl (ekohl@rz-online.de) + * UPDATE HISTORY: + * Created 19/06/2000 + */ + +/* INCLUDES *****************************************************************/ + +#include +#include + +/* DATA **********************************************************************/ + + +HAL_DISPATCH EXPORTED HalDispatchTable = +{ + HAL_DISPATCH_VERSION, + NULL, // HalQuerySystemInformation + NULL, // HalSetSystemInformation + NULL, // HalQueryBusSlots + NULL, // HalDeviceControl + xHalExamineMBR, + xHalIoAssignDriveLetters, + NULL, // HalIoReadPartitionTable + NULL, // HalIoSetPartitionInformation + NULL, // HalIoWritePartitionTable + NULL, // HalReferenceHandlerForBus + NULL, // HalReferenceBusHandler + NULL // HalDereferenceBusHandler +}; + + +HAL_PRIVATE_DISPATCH EXPORTED HalPrivateDispatchTable = +{ + HAL_PRIVATE_DISPATCH_VERSION + // HalHandlerForBus + // HalHandlerForConfigSpace + // HalCompleteDeviceControl + // HalRegisterBusHandler + // any more?? +}; + +/* EOF */ \ No newline at end of file diff --git a/reactos/ntoskrnl/io/xhaldrv.c b/reactos/ntoskrnl/io/xhaldrv.c new file mode 100644 index 00000000000..10648e35670 --- /dev/null +++ b/reactos/ntoskrnl/io/xhaldrv.c @@ -0,0 +1,193 @@ +/* $Id: xhaldrv.c,v 1.1 2000/06/30 22:52:49 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/io/xhaldrv.c + * PURPOSE: Hal drive routines + * PROGRAMMER: Eric Kohl (ekohl@rz-online.de) + * UPDATE HISTORY: + * Created 19/06/2000 + */ + +/* INCLUDES *****************************************************************/ + +#include +#include + +//#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +VOID +FASTCALL +xHalExamineMBR ( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG MBRTypeIdentifier, + OUT PVOID * Buffer + ) +{ + KEVENT Event; + IO_STATUS_BLOCK StatusBlock; + LARGE_INTEGER Offset; + PUCHAR LocalBuffer; + PIRP Irp; + NTSTATUS Status; + + DPRINT ("xHalExamineMBR()\n"); + *Buffer = NULL; + + if (SectorSize < 512) + SectorSize = 512; + if (SectorSize > 4096) + SectorSize = 4096; + + LocalBuffer = (PUCHAR)ExAllocatePool (PagedPool, + SectorSize); + if (LocalBuffer == NULL) + return; + + KeInitializeEvent (&Event, + NotificationEvent, + FALSE); + + Offset.QuadPart = 0; + + Irp = IoBuildSynchronousFsdRequest (IRP_MJ_READ, + DeviceObject, + LocalBuffer, + SectorSize, + &Offset, + &Event, + &StatusBlock); + + Status = IoCallDriver (DeviceObject, + Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject (&Event, + Executive, + KernelMode, + FALSE, + NULL); + Status = StatusBlock.Status; + } + + if (!NT_SUCCESS(Status)) + { + DPRINT ("xHalExamineMBR failed (Status = 0x%08lx)\n", + Status); + ExFreePool (LocalBuffer); + return; + } + + if (LocalBuffer[0x1FE] != 0x55 || LocalBuffer[0x1FF] != 0xAA) + { + DPRINT ("xHalExamineMBR: invalid MBR signature\n"); + ExFreePool (LocalBuffer); + return; + } + + if (LocalBuffer[0x1C2] != MBRTypeIdentifier) + { + DPRINT ("xHalExamineMBR: invalid MBRTypeIdentifier\n"); + ExFreePool (LocalBuffer); + return; + } + + *Buffer = (PVOID)LocalBuffer; +} + +VOID +FASTCALL +xHalIoAssignDriveLetters ( + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString + ) +{ + PCONFIGURATION_INFORMATION ConfigInfo; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK StatusBlock; + UNICODE_STRING UnicodeString1; + UNICODE_STRING UnicodeString2; + HANDLE FileHandle; + PWSTR Buffer1; + PWSTR Buffer2; + ULONG i; + NTSTATUS Status; + + DPRINT ("xHalIoAssignDriveLetters()\n"); + + ConfigInfo = IoGetConfigurationInformation (); + + Buffer1 = (PWSTR)ExAllocatePool (PagedPool, + 64 * sizeof(WCHAR)); + Buffer2 = (PWSTR)ExAllocatePool (PagedPool, + 32 * sizeof(WCHAR)); + + // Create PhysicalDrive links + DPRINT ("Physical disk drives: %d\n", ConfigInfo->DiskCount); + + for (i = 0; i < ConfigInfo->DiskCount; i++) + { + swprintf (Buffer1, + L"\\Device\\Harddisk%d\\Partition0", + i); + RtlInitUnicodeString (&UnicodeString1, + Buffer1); + + InitializeObjectAttributes (&ObjectAttributes, + &UnicodeString1, + 0, + NULL, + NULL); + + Status = NtOpenFile (&FileHandle, + 0x10001, + &ObjectAttributes, + &StatusBlock, + 1, + 0x20); + if (NT_SUCCESS(Status)) + { + swprintf (Buffer2, + L"\\??\\PhysicalDrive%d", + i); + RtlInitUnicodeString (&UnicodeString2, + Buffer2); + + DPRINT ("Creating link: %S ==> %S\n", + Buffer2, + Buffer1); + + IoCreateSymbolicLink (&UnicodeString2, + &UnicodeString1); + + NtClose (FileHandle); + } + } + ExFreePool (Buffer2); + ExFreePool (Buffer1); + + // Assign pre-assigned (registry) partitions + + // Assign bootable partitions + + // Assign remaining primary partitions + + // Assign extended (logical) partitions + + // Assign floppy drives + DPRINT("Floppy drives: %d\n", ConfigInfo->FloppyCount); + + // Assign cdrom drives + DPRINT("CD-Rom drives: %d\n", ConfigInfo->CDRomCount); + + // Any more ?? + +} + +/* EOF */ \ No newline at end of file diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index d380f7b9141..1f4d9b7b82d 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.48 2000/06/29 23:35:38 dwelch Exp $ +/* $Id: main.c,v 1.49 2000/06/30 22:53:32 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,6 +33,7 @@ ULONG EXPORTED NtBuildNumber = KERNEL_VERSION_BUILD; ULONG EXPORTED NtGlobalFlag = 0; CHAR EXPORTED KeNumberProcessors = 1; +LOADER_PARAMETER_BLOCK EXPORTED KeLoaderBlock; /* FUNCTIONS ****************************************************************/ @@ -301,6 +302,14 @@ void _main(boot_param* _bp) CHECKPOINT; LdrLoadAutoConfigDrivers(); + /* + * Assign drive letters + */ + IoAssignDriveLetters (&KeLoaderBlock, + NULL, + NULL, + NULL); + /* * Launch initial process */ diff --git a/reactos/ntoskrnl/makefile_rex b/reactos/ntoskrnl/makefile_rex index 44ab39c53d2..63b5327c68e 100644 --- a/reactos/ntoskrnl/makefile_rex +++ b/reactos/ntoskrnl/makefile_rex @@ -1,4 +1,4 @@ -# $Id: makefile_rex,v 1.75 2000/06/29 23:35:32 dwelch Exp $ +# $Id: makefile_rex,v 1.76 2000/06/30 22:50:53 ekohl Exp $ # # ReactOS Operating System # @@ -153,7 +153,9 @@ OBJECTS_IO = \ io/shutdown.o \ io/symlink.o \ io/timer.o \ - io/vpb.o + io/vpb.o \ + io/xhaldisp.o \ + io/xhaldrv.o # Object Manager (Ob) OBJECTS_OB = \ diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index eaf60513362..b181a807106 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.76 2000/06/18 15:21:18 ekohl Exp $ +; $Id: ntoskrnl.def,v 1.77 2000/06/30 22:50:53 ekohl Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -193,8 +193,8 @@ FsRtlUninitializeFileLock@4 FsRtlUninitializeLargeMcb@4 FsRtlUninitializeMcb@4 FsRtlUninitializeOplock@4 -;HalDispatchTable DATA -;HalPrivateDispatchTable DATA +HalDispatchTable DATA +HalPrivateDispatchTable DATA ;@InterlockedCompareExchange@12 InterlockedCompareExchange@12 ;@InterlockedDecrement@4 @@ -374,7 +374,7 @@ KeInsertQueueApc@16 KeInsertQueueDpc@12 ;KeIsExecutingDpc KeLeaveCriticalRegion@0 -;KeLoaderBlock DATA +KeLoaderBlock DATA KeNumberProcessors DATA ;KeProfileInterrupt ;KeProfileInterruptWithSource diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index 7915b0904f3..3c35f51edf2 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.63 2000/06/18 15:21:18 ekohl Exp $ +; $Id: ntoskrnl.edf,v 1.64 2000/06/30 22:50:53 ekohl Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -192,8 +192,8 @@ FsRtlUninitializeFileLock=FsRtlUninitializeFileLock@4 FsRtlUninitializeLargeMcb=FsRtlUninitializeLargeMcb@4 FsRtlUninitializeMcb=FsRtlUninitializeMcb@4 FsRtlUninitializeOplock=FsRtlUninitializeOplock@4 -;HalDispatchTable DATA -;HalPrivateDispatchTable DATA +HalDispatchTable DATA +HalPrivateDispatchTable DATA ;InterlockedCompareExchange=@InterlockedCompareExchange@12 InterlockedCompareExchange=InterlockedCompareExchange@12 ;InterlockedDecrement=@InterlockedDecrement@4 @@ -369,7 +369,7 @@ KeInsertQueueApc=KeInsertQueueApc@16 KeInsertQueueDpc=KeInsertQueueDpc@12 ;KeIsExecutingDpc KeLeaveCriticalRegion=KeLeaveCriticalRegion@0 -;KeLoaderBlock DATA +KeLoaderBlock DATA KeNumberProcessors DATA ;KeProfileInterrupt ;KeProfileInterruptWithSource