svn will drive me nuts, part 1/x

svn path=/branches/reactos-yarotows/; revision=46505
This commit is contained in:
Jérôme Gardou 2010-03-27 23:28:24 +00:00
parent b6edb50eb1
commit 84b4727064
14 changed files with 3095 additions and 26 deletions

View file

@ -567,8 +567,7 @@ CmBattCreateFdo(IN PDRIVER_OBJECT DriverObject,
}
/* Set FDO flags */
FdoDeviceObject->Flags |= DO_BUFFERED_IO;
FdoDeviceObject->Flags |= DO_MAP_IO_BUFFER;
FdoDeviceObject->Flags |= (DO_POWER_PAGABLE | DO_BUFFERED_IO);
FdoDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
/* Initialize the extension */

View file

@ -21,8 +21,17 @@ NTAPI
CompBattOpenClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
PAGED_CODE();
if (CompBattDebug & 0x100) DbgPrint("CompBatt: ENTERING OpenClose\n");
/* Complete the IRP with success */
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IofCompleteRequest(Irp, IO_NO_INCREMENT);
/* Return success */
if (CompBattDebug & 0x100) DbgPrint("CompBatt: Exiting OpenClose\n");
return STATUS_SUCCESS;
}
NTSTATUS
@ -30,8 +39,28 @@ NTAPI
CompBattSystemControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
PCOMPBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
NTSTATUS Status;
PAGED_CODE();
if (CompBattDebug & 1) DbgPrint("CompBatt: ENTERING System Control\n");
/* Are we attached yet? */
if (DeviceExtension->AttachedDevice)
{
/* Send it up the stack */
IoSkipCurrentIrpStackLocation(Irp);
Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp);
}
else
{
/* We don't support WMI */
Status = STATUS_NOT_SUPPORTED;
Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
IofCompleteRequest(Irp, IO_NO_INCREMENT);
}
/* Return status */
return Status;
}
NTSTATUS
@ -65,8 +94,23 @@ NTAPI
CompBattIoctl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
PCOMPBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
NTSTATUS Status;
if (CompBattDebug & 1) DbgPrint("CompBatt: ENTERING Ioctl\n");
/* Let the class driver handle it */
Status = BatteryClassIoctl(DeviceExtension->ClassData, Irp);
if (Status == STATUS_NOT_SUPPORTED)
{
/* It failed, try the next driver up the stack */
Irp->IoStatus.Status = Status;
IoSkipCurrentIrpStackLocation(Irp);
Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp);
}
/* Return status */
if (CompBattDebug & 1) DbgPrint("CompBatt: EXITING Ioctl\n");
return Status;
}
NTSTATUS
@ -161,8 +205,18 @@ NTAPI
DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
/* Register add device routine */
DriverObject->DriverExtension->AddDevice = CompBattAddDevice;
/* Register other handlers */
DriverObject->MajorFunction[0] = CompBattOpenClose;
DriverObject->MajorFunction[2] = CompBattOpenClose;
DriverObject->MajorFunction[14] = CompBattIoctl;
DriverObject->MajorFunction[22] = CompBattPowerDispatch;
DriverObject->MajorFunction[23] = CompBattSystemControl;
DriverObject->MajorFunction[27] = CompBattPnpDispatch;
return STATUS_SUCCESS;
}
/* EOF */

View file

@ -52,6 +52,68 @@ typedef struct _COMPBATT_DEVICE_EXTENSION
PVOID NotificationEntry;
} COMPBATT_DEVICE_EXTENSION, *PCOMPBATT_DEVICE_EXTENSION;
extern ULONG CmBattDebug;
NTSTATUS
NTAPI
CompBattAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PdoDeviceObject
);
NTSTATUS
NTAPI
CompBattPowerDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
NTAPI
CompBattPnpDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
NTAPI
CompBattQueryInformation(
IN PCOMPBATT_DEVICE_EXTENSION FdoExtension,
IN ULONG Tag,
IN BATTERY_QUERY_INFORMATION_LEVEL InfoLevel,
IN OPTIONAL LONG AtRate,
IN PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG ReturnedLength
);
NTSTATUS
NTAPI
CompBattQueryStatus(
IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
IN ULONG Tag,
IN PBATTERY_STATUS BatteryStatus
);
NTSTATUS
NTAPI
CompBattSetStatusNotify(
IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
IN ULONG BatteryTag,
IN PBATTERY_NOTIFY BatteryNotify
);
NTSTATUS
NTAPI
CompBattDisableStatusNotify(
IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension
);
NTSTATUS
NTAPI
CompBattQueryTag(
IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
OUT PULONG Tag
);
extern ULONG CompBattDebug;
/* EOF */

View file

@ -17,8 +17,15 @@ NTAPI
CompBattPowerDispatch(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
PCOMPBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
if (CompBattDebug & 1) DbgPrint("CompBatt: PowerDispatch recieved power IRP.\n");
/* Start the next IRP */
PoStartNextPowerIrp(Irp);
/* Call the next driver in the stack */
IoSkipCurrentIrpStackLocation(Irp);
return PoCallDriver(DeviceExtension->AttachedDevice, Irp);
}
PCOMPBATT_BATTERY_ENTRY
@ -79,8 +86,82 @@ NTAPI
CompBattAddDevice(IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PdoDeviceObject)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
NTSTATUS Status;
UNICODE_STRING DeviceName;
PCOMPBATT_DEVICE_EXTENSION DeviceExtension;
PDEVICE_OBJECT DeviceObject;
UNICODE_STRING SymbolicLinkName;
BATTERY_MINIPORT_INFO MiniportInfo;
if (CompBattDebug & 2) DbgPrint("CompBatt: Got an AddDevice - %x\n", PdoDeviceObject);
/* Create the device */
RtlInitUnicodeString(&DeviceName, L"\\Device\\CompositeBattery");
Status = IoCreateDevice(DriverObject,
sizeof(COMPBATT_DEVICE_EXTENSION),
&DeviceName,
FILE_DEVICE_BATTERY,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&DeviceObject);
if (!NT_SUCCESS(Status)) return Status;
/* Setup symbolic link for Win32 access */
RtlInitUnicodeString(&SymbolicLinkName, L"\\DosDevices\\CompositeBattery");
IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName);
/* Initialize the device extension */
DeviceExtension = DeviceObject->DeviceExtension;
RtlZeroMemory(DeviceExtension, 0x1B0u);
/* Attach to device stack and set DO pointers */
DeviceExtension->AttachedDevice = IoAttachDeviceToDeviceStack(DeviceObject,
PdoDeviceObject);
DeviceExtension->DeviceObject = DeviceObject;
if (!DeviceExtension->AttachedDevice)
{
/* Fail */
if (CompBattDebug & 8)
DbgPrint("CompBattAddDevice: Could not attach to LowerDevice.\n");
IoDeleteDevice(DeviceObject);
return STATUS_UNSUCCESSFUL;
}
/* Set device object flags */
DeviceObject->Flags |= (DO_POWER_PAGABLE | DO_BUFFERED_IO);
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
/* Setup the device extension */
ExInitializeFastMutex(&DeviceExtension->Lock);
InitializeListHead(&DeviceExtension->BatteryList);
DeviceExtension->Flags = 0;
DeviceExtension->NextTag = 1;
/* Setup the miniport data */
RtlZeroMemory(&MiniportInfo, sizeof(MiniportInfo));
MiniportInfo.MajorVersion = BATTERY_CLASS_MAJOR_VERSION;
MiniportInfo.MinorVersion = BATTERY_CLASS_MINOR_VERSION;
MiniportInfo.Context = DeviceExtension;
MiniportInfo.DeviceName = &DeviceName;
MiniportInfo.QueryTag = (BCLASS_QUERY_TAG)CompBattQueryTag;
MiniportInfo.QueryInformation = (BCLASS_QUERY_INFORMATION)CompBattQueryInformation;
MiniportInfo.SetInformation = NULL;
MiniportInfo.QueryStatus = (BCLASS_QUERY_STATUS)CompBattQueryStatus;
MiniportInfo.SetStatusNotify = (BCLASS_SET_STATUS_NOTIFY)CompBattSetStatusNotify;
MiniportInfo.DisableStatusNotify = (BCLASS_DISABLE_STATUS_NOTIFY)CompBattDisableStatusNotify;
MiniportInfo.Pdo = NULL;
/* Register with the class driver */
Status = BatteryClassInitializeDevice(&MiniportInfo,
&DeviceExtension->ClassData);
if (!NT_SUCCESS(Status))
{
/* Undo everything */
IoDetachDevice(DeviceExtension->AttachedDevice);
IoDeleteDevice(DeviceObject);
}
/* Return status */
return Status;
}
NTSTATUS
@ -88,8 +169,94 @@ NTAPI
CompBattPnpDispatch(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
PIO_STACK_LOCATION IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS Status;
PCOMPBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
if (CompBattDebug & 1) DbgPrint("CompBatt: ENTERING PnpDispatch\n");
/* Set default error */
Status = STATUS_NOT_SUPPORTED;
/* Check what kind of PnP function this is */
switch (IoStackLocation->MinorFunction)
{
case IRP_MN_START_DEVICE:
/* Device is starting, register for new batteries and pick up current ones */
Status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange,
0,
(PVOID)&GUID_DEVICE_BATTERY,
DeviceObject->DriverObject,
(PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)CompBattPnpEventHandler,
DeviceExtension,
&DeviceExtension->NotificationEntry);
if (NT_SUCCESS(Status))
{
/* Now go get the batteries */
if (CompBattDebug & 2)
DbgPrint("CompBatt: Successfully registered for PnP notification\n");
Status = CompBattGetBatteries(DeviceExtension);
}
else
{
/* We failed */
if (CompBattDebug & 8)
DbgPrint("CompBatt: Couldn't register for PnP notification - %x\n",
Status);
}
case IRP_MN_CANCEL_STOP_DEVICE:
/* Explicitly say ok */
Status = STATUS_SUCCESS;
break;
case IRP_MN_CANCEL_REMOVE_DEVICE:
/* Explicitly say ok */
Status = STATUS_SUCCESS;
break;
case IRP_MN_SURPRISE_REMOVAL:
/* Explicitly say ok */
Status = STATUS_SUCCESS;
break;
case IRP_MN_QUERY_PNP_DEVICE_STATE:
/* Add this in */
Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
Status = STATUS_SUCCESS;
break;
default:
/* Not supported */
Status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
/* Set IRP status if we have one */
if (Status != STATUS_NOT_SUPPORTED) Irp->IoStatus.Status = Status;
/* Did someone pick it up? */
if ((NT_SUCCESS(Status)) || (Status == STATUS_NOT_SUPPORTED))
{
/* Still unsupported, try ACPI */
IoSkipCurrentIrpStackLocation(Irp);
Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp);
}
else
{
/* Complete the request */
Status = Irp->IoStatus.Status;
IofCompleteRequest(Irp, IO_NO_INCREMENT);
}
/* Release the remove lock and return status */
if (CompBattDebug & 1) DbgPrint("CompBatt: EXITING PnpDispatch\n");
return Status;
}
/* EOF */

180
drivers/bus/acpi/eval.c Normal file
View file

@ -0,0 +1,180 @@
#include <ntddk.h>
#include <acpi.h>
#include <acpisys.h>
#include <acpi_bus.h>
#include <acpi_drivers.h>
#include <acpiioct.h>
#include <glue.h>
#include <accommon.h>
#include <acobject.h>
#include <actypes.h>
#include <wdmguid.h>
#define NDEBUG
#include <debug.h>
NTSTATUS
NTAPI
Bus_PDO_EvalMethod(PPDO_DEVICE_DATA DeviceData,
PIRP Irp)
{
ULONG Signature;
NTSTATUS Status;
ACPI_OBJECT_LIST ParamList;
PACPI_EVAL_INPUT_BUFFER EvalInputBuff = Irp->AssociatedIrp.SystemBuffer;
ACPI_BUFFER RetBuff = {ACPI_ALLOCATE_BUFFER, NULL};
PACPI_EVAL_OUTPUT_BUFFER OutputBuf;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER *SimpleInt;
ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING *SimpleStr;
if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(ULONG))
return STATUS_INVALID_PARAMETER;
Signature = *((PULONG)Irp->AssociatedIrp.SystemBuffer);
switch (Signature)
{
case ACPI_EVAL_INPUT_BUFFER_SIGNATURE:
if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(ACPI_EVAL_INPUT_BUFFER))
return STATUS_INVALID_PARAMETER;
ParamList.Count = 0;
break;
case ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE:
SimpleInt = Irp->AssociatedIrp.SystemBuffer;
if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER))
return STATUS_INVALID_PARAMETER;
ParamList.Count = 1;
ParamList.Pointer = ExAllocatePool(NonPagedPool, sizeof(ACPI_OBJECT));
if (!ParamList.Pointer) return STATUS_INSUFFICIENT_RESOURCES;
ParamList.Pointer[0].Type = ACPI_TYPE_INTEGER;
ParamList.Pointer[0].Integer.Value = SimpleInt->IntegerArgument;
break;
case ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_SIGNATURE:
SimpleStr = Irp->AssociatedIrp.SystemBuffer;
if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING))
return STATUS_INVALID_PARAMETER;
ParamList.Count = 1;
ParamList.Pointer = ExAllocatePool(NonPagedPool, sizeof(ACPI_OBJECT));
if (!ParamList.Pointer) return STATUS_INSUFFICIENT_RESOURCES;
ParamList.Pointer[0].String.Pointer = (CHAR*)SimpleStr->String;
ParamList.Pointer[0].String.Length = SimpleStr->StringLength;
break;
default:
DPRINT1("Unsupported input buffer signature: %d\n", Signature);
return STATUS_NOT_IMPLEMENTED;
}
Status = AcpiEvaluateObject(DeviceData->AcpiHandle,
(CHAR*)EvalInputBuff->MethodName,
&ParamList,
&RetBuff);
if (ParamList.Count != 0)
ExFreePool(ParamList.Pointer);
if (ACPI_SUCCESS(Status))
{
ACPI_OBJECT *Obj = RetBuff.Pointer;
ULONG ExtraParamLength;
/* If we didn't get anything back then we're done */
if (!RetBuff.Pointer || RetBuff.Length == 0)
return STATUS_SUCCESS;
switch (Obj->Type)
{
case ACPI_TYPE_INTEGER:
ExtraParamLength = sizeof(ULONG);
break;
case ACPI_TYPE_STRING:
ExtraParamLength = Obj->String.Length;
break;
case ACPI_TYPE_BUFFER:
ExtraParamLength = Obj->Buffer.Length;
break;
case ACPI_TYPE_PACKAGE:
DPRINT1("ACPI_TYPE_PACKAGE not supported yet!\n");
return STATUS_UNSUCCESSFUL;
default:
ASSERT(FALSE);
return STATUS_UNSUCCESSFUL;
}
/* Enough space for a ULONG is always included */
if (ExtraParamLength >= sizeof(ULONG))
ExtraParamLength -= sizeof(ULONG);
else
ExtraParamLength = 0;
OutputBuf = ExAllocatePool(NonPagedPool, sizeof(ACPI_EVAL_OUTPUT_BUFFER) +
ExtraParamLength);
if (!OutputBuf) return STATUS_INSUFFICIENT_RESOURCES;
OutputBuf->Signature = ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE;
OutputBuf->Length = ExtraParamLength + sizeof(ACPI_METHOD_ARGUMENT);
OutputBuf->Count = 1;
switch (Obj->Type)
{
case ACPI_TYPE_INTEGER:
ACPI_METHOD_SET_ARGUMENT_INTEGER(OutputBuf->Argument, Obj->Integer.Value);
break;
case ACPI_TYPE_STRING:
ACPI_METHOD_SET_ARGUMENT_STRING(OutputBuf->Argument, Obj->String.Pointer);
break;
case ACPI_TYPE_BUFFER:
ACPI_METHOD_SET_ARGUMENT_BUFFER(OutputBuf->Argument, Obj->Buffer.Pointer, Obj->Buffer.Length);
break;
case ACPI_TYPE_PACKAGE:
DPRINT1("ACPI_TYPE_PACKAGE not supported yet!\n");
return STATUS_UNSUCCESSFUL;
default:
ASSERT(FALSE);
return STATUS_UNSUCCESSFUL;
}
if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(ACPI_EVAL_OUTPUT_BUFFER) +
ExtraParamLength)
{
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, OutputBuf, sizeof(ACPI_EVAL_OUTPUT_BUFFER) +
ExtraParamLength);
Irp->IoStatus.Information = sizeof(ACPI_EVAL_OUTPUT_BUFFER) + ExtraParamLength;
ExFreePool(OutputBuf);
return STATUS_SUCCESS;
}
else
{
ExFreePool(OutputBuf);
return STATUS_BUFFER_TOO_SMALL;
}
}
else
{
DPRINT1("Query method %s failed on %p\n", EvalInputBuff->MethodName, DeviceData->AcpiHandle);
return STATUS_UNSUCCESSFUL;
}
}

View file

@ -0,0 +1,138 @@
#include <ntddk.h>
#include <acpi.h>
#include <acpisys.h>
#include <acpi_bus.h>
#include <acpi_drivers.h>
#include <wdmguid.h>
#define NDEBUG
#include <debug.h>
VOID
NTAPI
AcpiInterfaceReference(PVOID Context)
{
UNIMPLEMENTED
}
VOID
NTAPI
AcpiInterfaceDereference(PVOID Context)
{
UNIMPLEMENTED
}
NTSTATUS
AcpiInterfaceConnectVector(PDEVICE_OBJECT Context,
ULONG GpeNumber,
KINTERRUPT_MODE Mode,
BOOLEAN Shareable,
PGPE_SERVICE_ROUTINE ServiceRoutine,
PVOID ServiceContext,
PVOID *ObjectContext)
{
UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
AcpiInterfaceDisconnectVector(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
AcpiInterfaceEnableEvent(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
AcpiInterfaceDisableEvent(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
AcpiInterfaceClearStatus(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
AcpiInterfaceNotificationsRegister(PDEVICE_OBJECT Context,
PDEVICE_NOTIFY_CALLBACK NotificationHandler,
PVOID NotificationContext)
{
UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
VOID
AcpiInterfaceNotificationsUnregister(PDEVICE_OBJECT Context,
PDEVICE_NOTIFY_CALLBACK NotificationHandler)
{
UNIMPLEMENTED
}
NTSTATUS
Bus_PDO_QueryInterface(PPDO_DEVICE_DATA DeviceData,
PIRP Irp)
{
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
PACPI_INTERFACE_STANDARD AcpiInterface;
if (IrpSp->Parameters.QueryInterface.Version != 1)
{
DPRINT1("Invalid version number: %d\n",
IrpSp->Parameters.QueryInterface.Version);
return STATUS_INVALID_PARAMETER;
}
if (RtlCompareMemory(IrpSp->Parameters.QueryInterface.InterfaceType,
&GUID_ACPI_INTERFACE_STANDARD, sizeof(GUID)) == sizeof(GUID))
{
DPRINT("GUID_ACPI_INTERFACE_STANDARD\n");
if (IrpSp->Parameters.QueryInterface.Size < sizeof(ACPI_INTERFACE_STANDARD))
{
DPRINT1("Buffer too small! (%d)\n", IrpSp->Parameters.QueryInterface.Size);
return STATUS_BUFFER_TOO_SMALL;
}
AcpiInterface = (PACPI_INTERFACE_STANDARD)IrpSp->Parameters.QueryInterface.Interface;
AcpiInterface->InterfaceReference = AcpiInterfaceReference;
AcpiInterface->InterfaceDereference = AcpiInterfaceDereference;
AcpiInterface->GpeConnectVector = AcpiInterfaceConnectVector;
AcpiInterface->GpeDisconnectVector = AcpiInterfaceDisconnectVector;
AcpiInterface->GpeEnableEvent = AcpiInterfaceEnableEvent;
AcpiInterface->GpeDisableEvent = AcpiInterfaceDisableEvent;
AcpiInterface->GpeClearStatus = AcpiInterfaceClearStatus;
AcpiInterface->RegisterForDeviceNotifications = AcpiInterfaceNotificationsRegister;
AcpiInterface->UnregisterForDeviceNotifications = AcpiInterfaceNotificationsUnregister;
return STATUS_SUCCESS;
}
else
{
DPRINT1("Invalid GUID\n");
return STATUS_INVALID_PARAMETER;
}
}

View file

@ -0,0 +1,51 @@
#ifdef __x86_64__
#define MAYBEFWD(x)
#else
#define MAYBEFWD(x) x
#endif
@ cdecl ScsiDebugPrint()
@ stdcall ScsiPortCompleteRequest(ptr long long long long)
@ stdcall ScsiPortConvertPhysicalAddressToUlong(long long)
@ stdcall ScsiPortConvertUlongToPhysicalAddress(long) MAYBEFWD(NTOSKRNL.RtlConvertUlongToLargeInteger)
@ stdcall ScsiPortFlushDma(ptr)
@ stdcall ScsiPortFreeDeviceBase(ptr ptr)
@ stdcall ScsiPortGetBusData(ptr long long long ptr long)
@ stdcall ScsiPortGetDeviceBase(ptr long long long long long long)
@ stdcall ScsiPortGetLogicalUnit(ptr long long long)
@ stdcall ScsiPortGetPhysicalAddress(ptr ptr ptr long)
@ stdcall ScsiPortGetSrb(ptr long long long long)
@ stdcall ScsiPortGetUncachedExtension(ptr ptr long)
@ stdcall ScsiPortGetVirtualAddress(ptr long long)
@ stdcall ScsiPortInitialize(ptr ptr ptr ptr)
@ stdcall ScsiPortIoMapTransfer(ptr ptr long long)
@ stdcall ScsiPortLogError(ptr ptr long long long long long)
@ stdcall ScsiPortMoveMemory(ptr ptr long)
@ cdecl ScsiPortNotification()
@ stdcall ScsiPortReadPortBufferUchar(ptr ptr long) MAYBEFWD(HAL.READ_PORT_BUFFER_UCHAR)
@ stdcall ScsiPortReadPortBufferUshort(ptr ptr long) MAYBEFWD(HAL.READ_PORT_BUFFER_USHORT)
@ stdcall ScsiPortReadPortBufferUlong(ptr ptr long) MAYBEFWD(HAL.READ_PORT_BUFFER_ULONG)
@ stdcall ScsiPortReadPortUchar(ptr) MAYBEFWD(HAL.READ_PORT_UCHAR)
@ stdcall ScsiPortReadPortUshort(ptr) MAYBEFWD(HAL.READ_PORT_USHORT)
@ stdcall ScsiPortReadPortUlong(ptr) MAYBEFWD(HAL.READ_PORT_ULONG)
@ stdcall ScsiPortReadRegisterBufferUchar(ptr ptr long) MAYBEFWD(NTOSKRNL.READ_REGISTER_BUFFER_UCHAR)
@ stdcall ScsiPortReadRegisterBufferUshort(ptr ptr long) MAYBEFWD(NTOSKRNL.READ_REGISTER_BUFFER_USHORT)
@ stdcall ScsiPortReadRegisterBufferUlong(ptr ptr long) MAYBEFWD(NTOSKRNL.READ_REGISTER_BUFFER_ULONG)
@ stdcall ScsiPortReadRegisterUchar(ptr) MAYBEFWD(NTOSKRNL.READ_REGISTER_UCHAR)
@ stdcall ScsiPortReadRegisterUshort(ptr) MAYBEFWD(NTOSKRNL.READ_REGISTER_USHORT)
@ stdcall ScsiPortReadRegisterUlong(ptr) MAYBEFWD(NTOSKRNL.READ_REGISTER_ULONG)
@ stdcall ScsiPortSetBusDataByOffset(ptr long long long ptr long long)
@ stdcall ScsiPortStallExecution(long) HAL.KeStallExecutionProcessor
@ stdcall ScsiPortValidateRange(ptr long long long long long long)
@ stdcall ScsiPortWritePortBufferUchar(ptr ptr long) MAYBEFWD(HAL.WRITE_PORT_BUFFER_UCHAR)
@ stdcall ScsiPortWritePortBufferUshort(ptr ptr long) MAYBEFWD(HAL.WRITE_PORT_BUFFER_USHORT)
@ stdcall ScsiPortWritePortBufferUlong(ptr ptr long) MAYBEFWD(HAL.WRITE_PORT_BUFFER_ULONG)
@ stdcall ScsiPortWritePortUchar(ptr long) MAYBEFWD(HAL.WRITE_PORT_UCHAR)
@ stdcall ScsiPortWritePortUshort(ptr long) MAYBEFWD(HAL.WRITE_PORT_USHORT)
@ stdcall ScsiPortWritePortUlong(ptr long) MAYBEFWD(HAL.WRITE_PORT_ULONG)
@ stdcall ScsiPortWriteRegisterBufferUchar(ptr ptr long) MAYBEFWD(NTOSKRNL.WRITE_REGISTER_BUFFER_UCHAR)
@ stdcall ScsiPortWriteRegisterBufferUshort(ptr ptr long) MAYBEFWD(NTOSKRNL.WRITE_REGISTER_BUFFER_USHORT)
@ stdcall ScsiPortWriteRegisterBufferUlong(ptr ptr long) MAYBEFWD(NTOSKRNL.WRITE_REGISTER_BUFFER_ULONG)
@ stdcall ScsiPortWriteRegisterUchar(ptr long) MAYBEFWD(NTOSKRNL.WRITE_REGISTER_UCHAR)
@ stdcall ScsiPortWriteRegisterUshort(ptr long) MAYBEFWD(NTOSKRNL.WRITE_REGISTER_USHORT)
@ stdcall ScsiPortWriteRegisterUlong(ptr long) MAYBEFWD(NTOSKRNL.WRITE_REGISTER_ULONG)

View file

@ -0,0 +1,250 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Storage Stack
* FILE: drivers/storage/scsiport/stubs.c
* PURPOSE: SCSI port driver
* PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
*/
/* INCLUDES *****************************************************************/
#include <ntddk.h>
#include <srb.h>
#define NDEBUG
#include <debug.h>
#ifdef _MSC_VER
#define DDKAPI
#endif
SCSI_PHYSICAL_ADDRESS
DDKAPI
ScsiPortConvertUlongToPhysicalAddress(
IN ULONG UlongAddress)
{
return RtlConvertUlongToLargeInteger(UlongAddress);
}
VOID
DDKAPI
ScsiPortReadPortBufferUchar(
IN PUCHAR Port,
IN PUCHAR Buffer,
IN ULONG Count)
{
READ_PORT_BUFFER_UCHAR(Port, Buffer, Count);
}
VOID
DDKAPI
ScsiPortReadPortBufferUshort(
IN PUSHORT Port,
IN PUSHORT Buffer,
IN ULONG Count)
{
READ_PORT_BUFFER_USHORT(Port, Buffer, Count);
}
VOID
DDKAPI
ScsiPortReadPortBufferUlong(
IN PULONG Port,
IN PULONG Buffer,
IN ULONG Count)
{
READ_PORT_BUFFER_ULONG(Port, Buffer, Count);
}
UCHAR
DDKAPI
ScsiPortReadPortUchar(
IN PUCHAR Port)
{
return READ_PORT_UCHAR(Port);
}
USHORT
DDKAPI
ScsiPortReadPortUshort(
IN PUSHORT Port)
{
return READ_PORT_USHORT(Port);
}
ULONG
DDKAPI
ScsiPortReadPortUlong(
IN PULONG Port)
{
return READ_PORT_ULONG(Port);
}
VOID
DDKAPI
ScsiPortReadRegisterBufferUchar(
IN PUCHAR Register,
IN PUCHAR Buffer,
IN ULONG Count)
{
READ_REGISTER_BUFFER_UCHAR(Register, Buffer, Count);
}
VOID
DDKAPI
ScsiPortReadRegisterBufferUshort(
IN PUSHORT Register,
IN PUSHORT Buffer,
IN ULONG Count)
{
READ_REGISTER_BUFFER_USHORT(Register, Buffer, Count);
}
VOID
DDKAPI
ScsiPortReadRegisterBufferUlong(
IN PULONG Register,
IN PULONG Buffer,
IN ULONG Count)
{
READ_REGISTER_BUFFER_ULONG(Register, Buffer, Count);
}
UCHAR
DDKAPI
ScsiPortReadRegisterUchar(
IN PUCHAR Register)
{
return READ_REGISTER_UCHAR(Register);
}
USHORT
DDKAPI
ScsiPortReadRegisterUshort(
IN PUSHORT Register)
{
return READ_REGISTER_USHORT(Register);
}
ULONG
DDKAPI
ScsiPortReadRegisterUlong(
IN PULONG Register)
{
return READ_REGISTER_ULONG(Register);
}
VOID
DDKAPI
ScsiPortWritePortBufferUchar(
IN PUCHAR Port,
IN PUCHAR Buffer,
IN ULONG Count)
{
WRITE_PORT_BUFFER_UCHAR(Port, Buffer, Count);
}
VOID
DDKAPI
ScsiPortWritePortBufferUshort(
IN PUSHORT Port,
IN PUSHORT Buffer,
IN ULONG Count)
{
WRITE_PORT_BUFFER_USHORT(Port, Buffer, Count);
}
VOID
DDKAPI
ScsiPortWritePortBufferUlong(
IN PULONG Port,
IN PULONG Buffer,
IN ULONG Count)
{
WRITE_PORT_BUFFER_ULONG(Port, Buffer, Count);
}
VOID
DDKAPI
ScsiPortWritePortUchar(
IN PUCHAR Port,
IN UCHAR Value)
{
WRITE_PORT_UCHAR(Port, Value);
}
VOID
DDKAPI
ScsiPortWritePortUshort(
IN PUSHORT Port,
IN USHORT Value)
{
WRITE_PORT_USHORT(Port, Value);
}
VOID
DDKAPI
ScsiPortWritePortUlong(
IN PULONG Port,
IN ULONG Value)
{
WRITE_PORT_ULONG(Port, Value);
}
VOID
DDKAPI
ScsiPortWriteRegisterBufferUchar(
IN PUCHAR Register,
IN PUCHAR Buffer,
IN ULONG Count)
{
WRITE_REGISTER_BUFFER_UCHAR(Register, Buffer, Count);
}
VOID
DDKAPI
ScsiPortWriteRegisterBufferUshort(
IN PUSHORT Register,
IN PUSHORT Buffer,
IN ULONG Count)
{
WRITE_REGISTER_BUFFER_USHORT(Register, Buffer, Count);
}
VOID
DDKAPI
ScsiPortWriteRegisterBufferUlong(
IN PULONG Register,
IN PULONG Buffer,
IN ULONG Count)
{
WRITE_REGISTER_BUFFER_ULONG(Register, Buffer, Count);
}
VOID
DDKAPI
ScsiPortWriteRegisterUchar(
IN PUCHAR Register,
IN ULONG Value)
{
WRITE_REGISTER_UCHAR(Register, Value);
}
VOID
DDKAPI
ScsiPortWriteRegisterUshort(
IN PUSHORT Register,
IN USHORT Value)
{
WRITE_REGISTER_USHORT(Register, Value);
}
VOID
DDKAPI
ScsiPortWriteRegisterUlong(
IN PULONG Register,
IN ULONG Value)
{
WRITE_REGISTER_ULONG(Register, Value);
}

1363
hal/halx86/up/pic.c Normal file

File diff suppressed because it is too large Load diff

98
hal/halx86/up/processor.c Normal file
View file

@ -0,0 +1,98 @@
/*
* PROJECT: ReactOS HAL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: hal/halx86/up/processor.c
* PURPOSE: HAL Processor Routines
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
/* INCLUDES ******************************************************************/
#include <hal.h>
#define NDEBUG
#include <debug.h>
LONG HalpActiveProcessors;
KAFFINITY HalpDefaultInterruptAffinity;
/* PRIVATE FUNCTIONS *********************************************************/
VOID
NTAPI
HaliHaltSystem(VOID)
{
/* Disable interrupts and halt the CPU */
_disable();
__halt();
}
/* FUNCTIONS *****************************************************************/
/*
* @implemented
*/
VOID
NTAPI
HalInitializeProcessor(IN ULONG ProcessorNumber,
IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
/* Set default IDR and stall count */
KeGetPcr()->IDR = 0xFFFFFFFB;
KeGetPcr()->StallScaleFactor = INITIAL_STALL_COUNT;
/* Update the interrupt affinity and processor mask */
InterlockedBitTestAndSet(&HalpActiveProcessors, ProcessorNumber);
InterlockedBitTestAndSet((PLONG)&HalpDefaultInterruptAffinity,
ProcessorNumber);
/* Register routines for KDCOM */
HalpRegisterKdSupportFunctions();
}
/*
* @implemented
*/
BOOLEAN
NTAPI
HalAllProcessorsStarted(VOID)
{
/* Do nothing */
return TRUE;
}
/*
* @implemented
*/
BOOLEAN
NTAPI
HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
IN PKPROCESSOR_STATE ProcessorState)
{
/* Ready to start */
return FALSE;
}
/*
* @implemented
*/
VOID
NTAPI
HalProcessorIdle(VOID)
{
/* Enable interrupts and halt the processor */
_enable();
__halt();
}
/*
* @implemented
*/
VOID
NTAPI
HalRequestIpi(KAFFINITY TargetProcessors)
{
/* Not implemented on UP */
__debugbreak();
}
/* EOF */

270
include/dxsdk/bdatif.idl Normal file
View file

@ -0,0 +1,270 @@
#ifndef DO_NO_IMPORTS
import "unknwn.idl";
import "strmif.idl";
import "tuner.idl";
import "bdaiface.idl";
#endif
interface IMPEG2_TIF_CONTROL;
interface IATSCChannelInfo;
interface IMPEG2PIDMap;
[
object,
uuid(DFEF4A68-EE61-415f-9CCB-CD95F2F98A3A),
pointer_default(unique)
]
interface IBDA_TIF_REGISTRATION : IUnknown
{
HRESULT
RegisterTIFEx(
[in] IPin * pTIFInputPin,
[in, out] ULONG * ppvRegistrationContext,
[in, out] IUnknown ** ppMpeg2DataControl);
HRESULT
UnregisterTIF(
[in] ULONG pvRegistrationContext);
}
[
object,
uuid(F9BAC2F9-4149-4916-B2EF-FAA202326862),
pointer_default(unique)
]
interface IMPEG2_TIF_CONTROL : IUnknown
{
HRESULT
RegisterTIF(
[in] IUnknown * pUnkTIF,
[in, out] ULONG * ppvRegistrationContext);
HRESULT
UnregisterTIF(
[in] ULONG pvRegistrationContext);
HRESULT
AddPIDs(
[in] ULONG ulcPIDs,
[in] ULONG * pulPIDs);
HRESULT
DeletePIDs(
[in] ULONG ulcPIDs,
[in] ULONG * pulPIDs);
HRESULT
GetPIDCount(
[out] ULONG * pulcPIDs);
HRESULT
GetPIDs(
[out] ULONG * pulcPIDs,
[out] ULONG * pulPIDs);
}
[
object,
uuid(A3B152DF-7A90-4218-AC54-9830BEE8C0B6),
pointer_default(unique)
]
interface ITuneRequestInfo : IUnknown
{
HRESULT
GetLocatorData(
[in] ITuneRequest *Request);
HRESULT
GetComponentData(
[in] ITuneRequest *CurrentRequest);
HRESULT
CreateComponentList(
[in] ITuneRequest *CurrentRequest);
HRESULT
GetNextProgram (
[in] ITuneRequest *CurrentRequest,
[out, retval] ITuneRequest **TuneRequest);
HRESULT
GetPreviousProgram(
[in] ITuneRequest *CurrentRequest,
[out, retval] ITuneRequest **TuneRequest);
HRESULT
GetNextLocator(
[in] ITuneRequest *CurrentRequest,
[out, retval] ITuneRequest **TuneRequest);
HRESULT
GetPreviousLocator(
[in] ITuneRequest *CurrentRequest,
[out, retval] ITuneRequest **TuneRequest);
}
[
object,
uuid(EFDA0C80-F395-42c3-9B3C-56B37DEC7BB7),
pointer_default(unique)
]
interface IGuideDataEvent : IUnknown
{
HRESULT
GuideDataAcquired();
HRESULT ProgramChanged(
[in] VARIANT varProgramDescriptionID);
HRESULT ServiceChanged(
[in] VARIANT varServiceDescriptionID);
HRESULT ScheduleEntryChanged(
[in] VARIANT varScheduleEntryDescriptionID);
HRESULT ProgramDeleted(
[in] VARIANT varProgramDescriptionID);
HRESULT ServiceDeleted(
[in] VARIANT varServiceDescriptionID);
HRESULT ScheduleDeleted(
[in] VARIANT varScheduleEntryDescriptionID);
}
[
object,
uuid(88EC5E58-BB73-41d6-99CE-66C524B8B591),
pointer_default(unique)
]
interface IGuideDataProperty : IUnknown
{
HRESULT
get_Name(
[out] BSTR *pbstrName);
HRESULT
get_Language(
[out] long *idLang);
HRESULT
get_Value(
[out] VARIANT *pvar);
}
[
object,
uuid(AE44423B-4571-475c-AD2C-F40A771D80EF),
pointer_default(unique)
]
interface IEnumGuideDataProperties : IUnknown
{
HRESULT
Next(
[in] unsigned long celt,
[out] IGuideDataProperty **ppprop,
[out] unsigned long *pcelt);
HRESULT
Skip(
[in] unsigned long celt);
HRESULT
Reset();
HRESULT
Clone(
[out] IEnumGuideDataProperties **ppenum);
}
[
object,
uuid(1993299C-CED6-4788-87A3-420067DCE0C7),
pointer_default(unique)
]
interface IEnumTuneRequests : IUnknown
{
HRESULT
Next(
[in] unsigned long celt,
[out] ITuneRequest **ppprop,
[out] unsigned long *pcelt);
HRESULT
Skip(
[in] unsigned long celt);
HRESULT
Reset();
HRESULT
Clone(
[out] IEnumTuneRequests **ppenum);
}
[
object,
uuid(61571138-5B01-43cd-AEAF-60B784A0BF93),
pointer_default(unique)
]
interface IGuideData : IUnknown
{
HRESULT
GetServices(
[out, retval] IEnumTuneRequests ** ppEnumTuneRequests);
HRESULT
GetServiceProperties(
[in] ITuneRequest * pTuneRequest,
[out, retval] IEnumGuideDataProperties ** ppEnumProperties);
HRESULT
GetGuideProgramIDs(
[out, retval] IEnumVARIANT ** pEnumPrograms);
HRESULT
GetProgramProperties(
[in] VARIANT varProgramDescriptionID,
[out, retval] IEnumGuideDataProperties ** ppEnumProperties);
HRESULT
GetScheduleEntryIDs(
[out, retval] IEnumVARIANT ** pEnumScheduleEntries);
HRESULT
GetScheduleEntryProperties(
[in] VARIANT varScheduleEntryDescriptionID,
[out, retval] IEnumGuideDataProperties ** ppEnumProperties);
}
[
object,
uuid(4764ff7c-fa95-4525-af4d-d32236db9e38),
pointer_default(unique)
]
interface IGuideDataLoader : IUnknown
{
HRESULT Init([in] IGuideData *pGuideStore);
HRESULT Terminate();
};
[
uuid(8224A083-7F8C-432D-B83E-3C5E9BDE3528),
version(1.0),
]
library PSISLOADLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(14EB8748-1753-4393-95AE-4F7E7A87AAD6),
helpstring("TIFLoad Class")
]
coclass TIFLoad
{
interface IGuideDataLoader;
interface IGuideDataEvent;
};
};

389
include/ndk/peb_teb.h Normal file
View file

@ -0,0 +1,389 @@
#define PASTE2(x,y) x##y
#define PASTE(x,y) PASTE2(x,y)
#ifdef EXPLICIT_32BIT
#define STRUCT(x) PASTE(x,32)
#define PTR(x) ULONG
#elif defined(EXPLICIT_64BIT)
#define STRUCT(x) PASTE(x,64)
#define PTR(x) ULONG64
#else
#define STRUCT(x) x
#define PTR(x) x
#endif
#if defined(_WIN64) && !defined(EXPLICIT_32BIT)
#define GDI_HANDLE_BUFFER_SIZE 60
#else
#define GDI_HANDLE_BUFFER_SIZE 34
#endif
typedef struct STRUCT(_PEB)
{
BOOLEAN InheritedAddressSpace;
BOOLEAN ReadImageFileExecOptions;
BOOLEAN BeingDebugged;
#if (NTDDI_VERSION >= NTDDI_WS03)
union
{
BOOLEAN BitField;
struct
{
BOOLEAN ImageUsesLargePages:1;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
BOOLEAN IsProtectedProcess:1;
BOOLEAN IsLegacyProcess:1;
BOOLEAN IsImageDynamicallyRelocated:1;
BOOLEAN SkipPatchingUser32Forwarders:1;
BOOLEAN SpareBits:3;
#else
BOOLEAN SpareBits:7;
#endif
};
};
#else
BOOLEAN SpareBool;
#endif
PTR(HANDLE) Mutant;
PTR(PVOID) ImageBaseAddress;
PTR(PPEB_LDR_DATA) Ldr;
PTR(struct _RTL_USER_PROCESS_PARAMETERS*) ProcessParameters;
PTR(PVOID) SubSystemData;
PTR(PVOID) ProcessHeap;
PTR(struct _RTL_CRITICAL_SECTION*) FastPebLock;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
PTR(PVOID) AltThunkSListPtr;
PTR(PVOID) IFEOKey;
union
{
ULONG CrossProcessFlags;
struct
{
ULONG ProcessInJob:1;
ULONG ProcessInitializing:1;
ULONG ProcessUsingVEH:1;
ULONG ProcessUsingVCH:1;
ULONG ReservedBits0:28;
};
};
union
{
PTR(PVOID) KernelCallbackTable;
PTR(PVOID) UserSharedInfoPtr;
};
#elif (NTDDI_VERSION >= NTDDI_WS03)
PTR(PVOID) AltThunkSListPtr;
PTR(PVOID) SparePtr2;
ULONG EnvironmentUpdateCount;
PTR(PVOID) KernelCallbackTable;
#else
PTR(PPEBLOCKROUTINE) FastPebLockRoutine;
PTR(PPEBLOCKROUTINE) FastPebUnlockRoutine;
ULONG EnvironmentUpdateCount;
PTR(PVOID) KernelCallbackTable;
#endif
ULONG SystemReserved[1];
ULONG SpareUlong; // AtlThunkSListPtr32
PTR(PPEB_FREE_BLOCK) FreeList;
ULONG TlsExpansionCounter;
PTR(PVOID) TlsBitmap;
ULONG TlsBitmapBits[2];
PTR(PVOID) ReadOnlySharedMemoryBase;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
PTR(PVOID) HotpatchInformation;
#else
PTR(PVOID) ReadOnlySharedMemoryHeap;
#endif
PTR(PVOID*) ReadOnlyStaticServerData;
PTR(PVOID) AnsiCodePageData;
PTR(PVOID) OemCodePageData;
PTR(PVOID) UnicodeCaseTableData;
ULONG NumberOfProcessors;
ULONG NtGlobalFlag;
LARGE_INTEGER CriticalSectionTimeout;
PTR(ULONG_PTR) HeapSegmentReserve;
PTR(ULONG_PTR) HeapSegmentCommit;
PTR(ULONG_PTR) HeapDeCommitTotalFreeThreshold;
PTR(ULONG_PTR) HeapDeCommitFreeBlockThreshold;
ULONG NumberOfHeaps;
ULONG MaximumNumberOfHeaps;
PTR(PVOID*) ProcessHeaps;
PTR(PVOID) GdiSharedHandleTable;
PTR(PVOID) ProcessStarterHelper;
ULONG GdiDCAttributeList;
PTR(struct _RTL_CRITICAL_SECTION*) LoaderLock;
ULONG OSMajorVersion;
ULONG OSMinorVersion;
USHORT OSBuildNumber;
USHORT OSCSDVersion;
ULONG OSPlatformId;
ULONG ImageSubsystem;
ULONG ImageSubsystemMajorVersion;
ULONG ImageSubsystemMinorVersion;
PTR(ULONG_PTR) ImageProcessAffinityMask;
ULONG GdiHandleBuffer[GDI_HANDLE_BUFFER_SIZE];
PTR(PPOST_PROCESS_INIT_ROUTINE) PostProcessInitRoutine;
PTR(PVOID) TlsExpansionBitmap;
ULONG TlsExpansionBitmapBits[32];
ULONG SessionId;
#if (NTDDI_VERSION >= NTDDI_WINXP)
ULARGE_INTEGER AppCompatFlags;
ULARGE_INTEGER AppCompatFlagsUser;
PTR(PVOID) pShimData;
PTR(PVOID) AppCompatInfo;
STRUCT(UNICODE_STRING) CSDVersion;
PTR(struct _ACTIVATION_CONTEXT_DATA*) ActivationContextData;
PTR(struct _ASSEMBLY_STORAGE_MAP*) ProcessAssemblyStorageMap;
PTR(struct _ACTIVATION_CONTEXT_DATA*) SystemDefaultActivationContextData;
PTR(struct _ASSEMBLY_STORAGE_MAP*) SystemAssemblyStorageMap;
PTR(ULONG_PTR) MinimumStackCommit;
#endif
#if (NTDDI_VERSION >= NTDDI_WS03)
PTR(PVOID*) FlsCallback;
STRUCT(LIST_ENTRY) FlsListHead;
PTR(PVOID) FlsBitmap;
ULONG FlsBitmapBits[4];
ULONG FlsHighIndex;
#endif
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
PTR(PVOID) WerRegistrationData;
PTR(PVOID) WerShipAssertPtr;
#endif
} STRUCT(PEB), *STRUCT(PPEB);
#if defined(_WIN64) && !defined(EXPLICIT_32BIT)
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Mutant) == 0x08);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Ldr) == 0x18);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FastPebLock) == 0x038);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), TlsExpansionCounter) == 0x070);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), NtGlobalFlag) == 0x0BC);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), GdiSharedHandleTable) == 0x0F8);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), LoaderLock) == 0x110);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageSubsystem) == 0x128);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageProcessAffinityMask) == 0x138);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), PostProcessInitRoutine) == 0x230);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), SessionId) == 0x2C0);
#if (NTDDI_VERSION >= NTDDI_WS03)
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FlsHighIndex) == 0x350);
#endif
#else
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Mutant) == 0x04);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Ldr) == 0x0C);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FastPebLock) == 0x01C);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), TlsExpansionCounter) == 0x03C);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), NtGlobalFlag) == 0x068);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), GdiSharedHandleTable) == 0x094);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), LoaderLock) == 0x0A0);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageSubsystem) == 0x0B4);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageProcessAffinityMask) == 0x0C0);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), PostProcessInitRoutine) == 0x14C);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), SessionId) == 0x1D4);
#if (NTDDI_VERSION >= NTDDI_WS03)
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FlsHighIndex) == 0x22C);
#endif
#endif
//
// GDI Batch Descriptor
//
typedef struct STRUCT(_GDI_TEB_BATCH)
{
ULONG Offset;
PTR(HANDLE) HDC;
ULONG Buffer[0x136];
} STRUCT(GDI_TEB_BATCH), *STRUCT(PGDI_TEB_BATCH);
//
// Thread Environment Block (TEB)
//
typedef struct STRUCT(_TEB)
{
STRUCT(NT_TIB) NtTib;
PTR(PVOID) EnvironmentPointer;
STRUCT(CLIENT_ID) ClientId;
PTR(PVOID) ActiveRpcHandle;
PTR(PVOID) ThreadLocalStoragePointer;
PTR(STRUCT(PPEB)) ProcessEnvironmentBlock;
ULONG LastErrorValue;
ULONG CountOfOwnedCriticalSections;
PTR(PVOID) CsrClientThread;
PTR(PVOID) Win32ThreadInfo;
ULONG User32Reserved[26];
ULONG UserReserved[5];
PTR(PVOID) WOW32Reserved;
LCID CurrentLocale;
ULONG FpSoftwareStatusRegister;
PTR(PVOID) SystemReserved1[54];
LONG ExceptionCode;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
PTR(struct _ACTIVATION_CONTEXT_STACK*) ActivationContextStackPointer;
UCHAR SpareBytes1[0x30 - 3 * sizeof(PTR(PVOID))];
ULONG TxFsContext;
#elif (NTDDI_VERSION >= NTDDI_WS03)
PTR(struct _ACTIVATION_CONTEXT_STACK*) ActivationContextStackPointer;
UCHAR SpareBytes1[0x34 - 3 * sizeof(PTR(PVOID))];
#else
ACTIVATION_CONTEXT_STACK ActivationContextStack;
UCHAR SpareBytes1[24];
#endif
STRUCT(GDI_TEB_BATCH) GdiTebBatch;
STRUCT(CLIENT_ID) RealClientId;
PTR(PVOID) GdiCachedProcessHandle;
ULONG GdiClientPID;
ULONG GdiClientTID;
PTR(PVOID) GdiThreadLocalInfo;
PTR(SIZE_T) Win32ClientInfo[62];
PTR(PVOID) glDispatchTable[233];
PTR(SIZE_T) glReserved1[29];
PTR(PVOID) glReserved2;
PTR(PVOID) glSectionInfo;
PTR(PVOID) glSection;
PTR(PVOID) glTable;
PTR(PVOID) glCurrentRC;
PTR(PVOID) glContext;
NTSTATUS LastStatusValue;
STRUCT(UNICODE_STRING) StaticUnicodeString;
WCHAR StaticUnicodeBuffer[261];
PTR(PVOID) DeallocationStack;
PTR(PVOID) TlsSlots[64];
STRUCT(LIST_ENTRY) TlsLinks;
PTR(PVOID) Vdm;
PTR(PVOID) ReservedForNtRpc;
PTR(PVOID) DbgSsReserved[2];
#if (NTDDI_VERSION >= NTDDI_WS03)
ULONG HardErrorMode;
#else
ULONG HardErrorsAreDisabled;
#endif
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
PTR(PVOID) Instrumentation[13 - sizeof(GUID)/sizeof(PTR(PVOID))];
GUID ActivityId;
PTR(PVOID) SubProcessTag;
PTR(PVOID) EtwLocalData;
PTR(PVOID) EtwTraceData;
#elif (NTDDI_VERSION >= NTDDI_WS03)
PTR(PVOID) Instrumentation[14];
PTR(PVOID) SubProcessTag;
PTR(PVOID) EtwLocalData;
#else
PTR(PVOID) Instrumentation[16];
#endif
PTR(PVOID) WinSockData;
ULONG GdiBatchCount;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
BOOLEAN SpareBool0;
BOOLEAN SpareBool1;
BOOLEAN SpareBool2;
#else
BOOLEAN InDbgPrint;
BOOLEAN FreeStackOnTermination;
BOOLEAN HasFiberData;
#endif
UCHAR IdealProcessor;
#if (NTDDI_VERSION >= NTDDI_WS03)
ULONG GuaranteedStackBytes;
#else
ULONG Spare3;
#endif
PTR(PVOID) ReservedForPerf;
PTR(PVOID) ReservedForOle;
ULONG WaitingOnLoaderLock;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
PTR(PVOID) SavedPriorityState;
PTR(ULONG_PTR) SoftPatchPtr1;
PTR(ULONG_PTR) ThreadPoolData;
#elif (NTDDI_VERSION >= NTDDI_WS03)
PTR(ULONG_PTR) SparePointer1;
PTR(ULONG_PTR) SoftPatchPtr1;
PTR(ULONG_PTR) SoftPatchPtr2;
#else
Wx86ThreadState Wx86Thread;
#endif
PTR(PVOID*) TlsExpansionSlots;
#if defined(_WIN64) && !defined(EXPLICIT_32BIT)
PTR(PVOID) DeallocationBStore;
PTR(PVOID) BStoreLimit;
#endif
ULONG ImpersonationLocale;
ULONG IsImpersonating;
PTR(PVOID) NlsCache;
PTR(PVOID) pShimData;
ULONG HeapVirtualAffinity;
PTR(HANDLE) CurrentTransactionHandle;
PTR(PTEB_ACTIVE_FRAME) ActiveFrame;
#if (NTDDI_VERSION >= NTDDI_WS03)
PVOID FlsData;
#endif
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
PVOID PreferredLangauges;
PVOID UserPrefLanguages;
PVOID MergedPrefLanguages;
ULONG MuiImpersonation;
union
{
struct
{
USHORT SpareCrossTebFlags:16;
};
USHORT CrossTebFlags;
};
union
{
struct
{
USHORT DbgSafeThunkCall:1;
USHORT DbgInDebugPrint:1;
USHORT DbgHasFiberData:1;
USHORT DbgSkipThreadAttach:1;
USHORT DbgWerInShipAssertCode:1;
USHORT DbgIssuedInitialBp:1;
USHORT DbgClonedThread:1;
USHORT SpareSameTebBits:9;
};
USHORT SameTebFlags;
};
PTR(PVOID) TxnScopeEntercallback;
PTR(PVOID) TxnScopeExitCAllback;
PTR(PVOID) TxnScopeContext;
ULONG LockCount;
ULONG ProcessRundown;
ULONG64 LastSwitchTime;
ULONG64 TotalSwitchOutTime;
LARGE_INTEGER WaitReasonBitMap;
#else
BOOLEAN SafeThunkCall;
BOOLEAN BooleanSpare[3];
#endif
} STRUCT(TEB), *STRUCT(PTEB);
#if defined(_WIN64) && !defined(EXPLICIT_32BIT)
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x038);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x2C0);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x2F0);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), LastStatusValue) == 0x1250);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), Vdm) == 0x1690);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), HardErrorMode) == 0x16B0);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiBatchCount) == 0x1740);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), IdealProcessor) == 0x1747);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), WaitingOnLoaderLock) == 0x1760);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), TlsExpansionSlots) == 0x1780);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), WaitingOnLoaderLock) == 0x1760);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0x17C0);
#else
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x01C);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x1A4);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x1D4);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), LastStatusValue) == 0xBF4);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), Vdm) == 0xF18);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiBatchCount) == 0xF70);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), TlsExpansionSlots) == 0xF94);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0xFB0);
#endif
#undef PTR
#undef STRUCT
#undef PASTE
#undef PASTE2
#undef GDI_HANDLE_BUFFER_SIZE

Binary file not shown.

View file

@ -2180,9 +2180,19 @@ IopEnumerateDetectedDevices(
const UNICODE_STRING IdentifierMouse = RTL_CONSTANT_STRING(L"PointerController");
UNICODE_STRING HardwareIdMouse = RTL_CONSTANT_STRING(L"*PNP0F13\0");
static ULONG DeviceIndexMouse = 0;
const UNICODE_STRING IdentifierParallel = RTL_CONSTANT_STRING(L"PARALLEL");
UNICODE_STRING HardwareIdParallel = RTL_CONSTANT_STRING(L"*PNP0400\0");
static ULONG DeviceIndexParallel = 0;
const UNICODE_STRING IdentifierFloppy = RTL_CONSTANT_STRING(L"FLOPPY");
UNICODE_STRING HardwareIdFloppy = RTL_CONSTANT_STRING(L"*PNP0700\0");
static ULONG DeviceIndexFloppy = 0;
const UNICODE_STRING IdentifierIsa = RTL_CONSTANT_STRING(L"ISA");
UNICODE_STRING HardwareIdIsa = RTL_CONSTANT_STRING(L"*PNP0A00\0");
static ULONG DeviceIndexIsa = 0;
UNICODE_STRING HardwareIdKey;
PUNICODE_STRING pHardwareId;
ULONG DeviceIndex = 0;
BOOLEAN IsDeviceDesc;
if (RelativePath)
{
@ -2409,16 +2419,19 @@ IopEnumerateDetectedDevices(
{
pHardwareId = &HardwareIdSerial;
DeviceIndex = DeviceIndexSerial++;
IsDeviceDesc = TRUE;
}
else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierKeyboard, FALSE) == 0)
{
pHardwareId = &HardwareIdKeyboard;
DeviceIndex = DeviceIndexKeyboard++;
IsDeviceDesc = FALSE;
}
else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierMouse, FALSE) == 0)
{
pHardwareId = &HardwareIdMouse;
DeviceIndex = DeviceIndexMouse++;
IsDeviceDesc = FALSE;
}
else if (NT_SUCCESS(Status))
{
@ -2427,19 +2440,51 @@ IopEnumerateDetectedDevices(
{
pHardwareId = &HardwareIdPci;
DeviceIndex = DeviceIndexPci++;
IsDeviceDesc = FALSE;
}
else if (RtlCompareUnicodeString(&ValueName, &IdentifierIsa, FALSE) == 0)
{
pHardwareId = &HardwareIdIsa;
DeviceIndex = DeviceIndexIsa++;
IsDeviceDesc = FALSE;
}
#ifdef ENABLE_ACPI
else if (RtlCompareUnicodeString(&ValueName, &IdentifierAcpi, FALSE) == 0)
{
pHardwareId = &HardwareIdAcpi;
DeviceIndex = DeviceIndexAcpi++;
IsDeviceDesc = FALSE;
}
#endif
else
else /* Now let's detect devices with a device number at the end */
{
/* Unknown device */
DPRINT("Unknown device '%wZ'\n", &ValueName);
goto nextdevice;
/* First, we remove the number */
ValueName.Length -= sizeof(WCHAR);
/* Let's see if it is a floppy device */
if (RtlCompareUnicodeString(&ValueName, &IdentifierFloppy, FALSE) == 0)
{
pHardwareId = &HardwareIdFloppy;
DeviceIndex = DeviceIndexFloppy++;
IsDeviceDesc = FALSE;
}
/* Nope, is it a parallel port? */
else if (RtlCompareUnicodeString(&ValueName, &IdentifierParallel, FALSE) == 0)
{
pHardwareId = &HardwareIdParallel;
DeviceIndex = DeviceIndexParallel++;
IsDeviceDesc = FALSE;
}
/* Nope, out of ideas so let's skip this one */
else
{
ValueName.Length += sizeof(WCHAR);
DPRINT("Unknown device '%wZ'\n", &ValueName);
goto nextdevice;
}
/* Add the number back */
ValueName.Length += sizeof(WCHAR);
}
}
else
@ -2486,12 +2531,15 @@ IopEnumerateDetectedDevices(
goto nextdevice;
}
DPRINT("Found %wZ #%lu (%wZ)\n", &ValueName, DeviceIndex, &HardwareIdKey);
Status = ZwSetValueKey(hLevel2Key, &DeviceDescU, 0, REG_SZ, ValueName.Buffer, ValueName.MaximumLength);
if (!NT_SUCCESS(Status))
if (IsDeviceDesc)
{
DPRINT("ZwSetValueKey() failed with status 0x%08lx\n", Status);
ZwDeleteKey(hLevel2Key);
goto nextdevice;
Status = ZwSetValueKey(hLevel2Key, &DeviceDescU, 0, REG_SZ, ValueName.Buffer, ValueName.MaximumLength);
if (!NT_SUCCESS(Status))
{
DPRINT("ZwSetValueKey() failed with status 0x%08lx\n", Status);
ZwDeleteKey(hLevel2Key);
goto nextdevice;
}
}
Status = ZwSetValueKey(hLevel2Key, &HardwareIDU, 0, REG_MULTI_SZ, pHardwareId->Buffer, pHardwareId->MaximumLength);
if (!NT_SUCCESS(Status))