21,616
社区成员




VOID
mouDetach(IN PDEVICE_OBJECT pDeviceObject)
{
PC2P_DEV_EXT devExt;
//BOOLEAN NoRequestsOutstanding = FALSE;
devExt = (PC2P_DEV_EXT)pDeviceObject->DeviceExtension;
IoDetachDevice(devExt->TargetDeviceObject);
devExt->TargetDeviceObject = NULL;
IoDeleteDevice(pDeviceObject);
devExt->pFilterDerivceObject = NULL;
DbgPrint(("Detach Finished\n"));
return;
}
#include <ntddk.h>
#define KBD_DRIVER_NAME L"\\driver\\mouclass"
#define DELAY_ONE_MICROSECOND (-10)
#define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
#define DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000)
typedef struct _C2P_DEV_EXT
{
ULONG NodeSize;
PDEVICE_OBJECT pFilterDerivceObject;
KSPIN_LOCK IoRequestsSpinLock;
KEVENT IoInprogressEvent;
PDEVICE_OBJECT TargetDeviceObject;
PDEVICE_OBJECT LowerDeviceObject;
} C2P_DEV_EXT, *PC2P_DEV_EXT;
NTSTATUS ObReferenceObjectByName(PUNICODE_STRING ObjectName, ULONG Attributes, PACCESS_STATE AccessState, ACCESS_MASK DesiredAccess, POBJECT_TYPE ObjectType, KPROCESSOR_MODE AccessMode, PVOID ParseContext, PVOID *object);
extern POBJECT_TYPE *IoDriverObjectType;
NTSTATUS mouDevExtInit(
_In_ PC2P_DEV_EXT devExt,
_In_ PDEVICE_OBJECT pFilterDeviceObject,
_In_ PDEVICE_OBJECT pTargetDeviceObject,
_In_ PDEVICE_OBJECT pLowerDeviceobject)
{
memset(devExt, 0, sizeof(C2P_DEV_EXT));
devExt->NodeSize = sizeof(C2P_DEV_EXT);
devExt->pFilterDerivceObject = pFilterDeviceObject;
KeInitializeSpinLock(&(devExt->IoRequestsSpinLock));
KeInitializeEvent(&(devExt->IoInprogressEvent), NotificationEvent, FALSE);
devExt->TargetDeviceObject = pTargetDeviceObject;
devExt->LowerDeviceObject = pLowerDeviceobject;
return(STATUS_SUCCESS);
}
NTSTATUS moBindFilter(PDRIVER_OBJECT driverObject)
{
UNICODE_STRING uniNTNameString;
NTSTATUS status;
PC2P_DEV_EXT devext;
PDRIVER_OBJECT moclassDriverObject;
PDEVICE_OBJECT TargDevicerObject;
PDEVICE_OBJECT FilterDeviceObject;
PDEVICE_OBJECT LowDeviceObject;
KdPrint(("mouse:bind start\n"));
RtlInitUnicodeString(&uniNTNameString, KBD_DRIVER_NAME);
status = ObReferenceObjectByName(
&uniNTNameString,
OBJ_CASE_INSENSITIVE,
NULL,
0,
*IoDriverObjectType,
KernelMode,
NULL,
&moclassDriverObject
);
if (!NT_SUCCESS(status))
{
KdPrint(("mouse:bind error\n"));
return(status);
}
else
{
ObDereferenceObject(driverObject);
}
TargDevicerObject = moclassDriverObject->DeviceObject;
while (TargDevicerObject)
{
status = IoCreateDevice(
driverObject,
sizeof(C2P_DEV_EXT),
NULL,
TargDevicerObject->DeviceType,
TargDevicerObject->Characteristics,
FALSE,
&FilterDeviceObject
);
if (!NT_SUCCESS(status))
{
KdPrint(("mouse:createdevice error\n"));
return (status);
}
LowDeviceObject = IoAttachDeviceToDeviceStack(FilterDeviceObject, TargDevicerObject);//绑定过滤设备 返回原来的过滤设备
if (!LowDeviceObject)
{
KdPrint(("myattach:Couldn't attach to mytest device object \n"));
IoDeleteDevice(FilterDeviceObject);
FilterDeviceObject = NULL;
return(status);
}
devext = (PC2P_DEV_EXT)(FilterDeviceObject->DeviceExtension);
mouDevExtInit(devext, FilterDeviceObject, TargDevicerObject, LowDeviceObject);
FilterDeviceObject->Characteristics = LowDeviceObject->Characteristics;
FilterDeviceObject->StackSize = LowDeviceObject->StackSize;
FilterDeviceObject->DeviceType = LowDeviceObject->DeviceType;
FilterDeviceObject->Flags = FilterDeviceObject->Flags | (LowDeviceObject->Flags&(DO_BUFFERED_IO | DO_DIRECT_IO | DO_POWER_PAGABLE));
TargDevicerObject = TargDevicerObject->NextDevice;
}
return status;
}
NTSTATUS mouDispatchGeneral(
_In_ PDEVICE_OBJECT deviceobject,
_In_ PIRP irp
)
{
KdPrint(("other diapatch!"));
IoSkipCurrentIrpStackLocation(irp);
return IofCallDriver(((PC2P_DEV_EXT)deviceobject->DeviceExtension)->LowerDeviceObject, irp);
}
VOID
mouDetach(IN PDEVICE_OBJECT pDeviceObject)
{
PC2P_DEV_EXT devExt;
//BOOLEAN NoRequestsOutstanding = FALSE;
devExt = (PC2P_DEV_EXT)pDeviceObject->DeviceExtension;
IoDetachDevice(devExt->TargetDeviceObject);
devExt->TargetDeviceObject = NULL;
IoDeleteDevice(pDeviceObject);
devExt->pFilterDerivceObject = NULL;
DbgPrint(("Detach Finished\n"));
return;
}
VOID
mouUnload(
IN PDRIVER_OBJECT driverobject
)
{
PDEVICE_OBJECT DeviceObject;
//PDEVICE_OBJECT oldDeviceObject;
//PC2P_DEV_EXT devext;
/* PRKTHREAD currentthread;
currentthread = KeGetCurrentThread();
KeSetPriorityThread(currentthread, LOW_REALTIME_PRIORITY);*/
KdPrint(("DRIVERENTRY unLoading..\n"));
DeviceObject = driverobject->DeviceObject;
while (DeviceObject)
{
mouDetach(DeviceObject);
DeviceObject = DeviceObject->NextDevice;
}
ASSERT(NULL == driverobject->DeviceObject);
return;
}
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT driver,
_In_ PUNICODE_STRING path
)
{
ULONG i;
NTSTATUS status;
UNREFERENCED_PARAMETER(path);
KdPrint(("key.sys:driverEntry \n"));
for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
{
driver->MajorFunction[i] = mouDispatchGeneral;
}
driver->DriverUnload = mouUnload;
status = moBindFilter(driver);
return status;
}