mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
svn will drive me nuts, part 1/x
svn path=/branches/reactos-yarotows/; revision=46505
This commit is contained in:
parent
b6edb50eb1
commit
84b4727064
14 changed files with 3095 additions and 26 deletions
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
180
drivers/bus/acpi/eval.c
Normal 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;
|
||||
}
|
||||
}
|
138
drivers/bus/acpi/interface.c
Normal file
138
drivers/bus/acpi/interface.c
Normal 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;
|
||||
}
|
||||
}
|
51
drivers/storage/scsiport/scsiport.pspec
Normal file
51
drivers/storage/scsiport/scsiport.pspec
Normal 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)
|
250
drivers/storage/scsiport/stubs.c
Normal file
250
drivers/storage/scsiport/stubs.c
Normal 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
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
98
hal/halx86/up/processor.c
Normal 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
270
include/dxsdk/bdatif.idl
Normal 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
389
include/ndk/peb_teb.h
Normal 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.
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue