PVOID pRegistrationHandle;
VOID DriverUnload(
_In_ struct _DRIVER_OBJECT
*
DriverObject
)
{
KdPrint((
"DriverUnload\n"
));
/
/
卸载驱动
if
(NULL !
=
pRegistrationHandle)
{
KdPrint((
"ObUnRegisterCallbacks\n"
));
ObUnRegisterCallbacks(pRegistrationHandle);
}
PDEVICE_OBJECT pDev;
pDev
=
DriverObject
-
>DeviceObject;
if
(NULL !
=
pDev)
{
IoDeleteDevice(pDev);
/
/
删除设备
}
}
extern
"C"
UCHAR
*
PsGetProcessImageFileName(
__in PEPROCESS Process
);
/
/
extern
int
*
ObTypeIndexTable;
OB_PREOP_CALLBACK_STATUS PreProcessHandle(
_In_ PVOID RegistrationContext,
_Inout_ POB_PRE_OPERATION_INFORMATION OperationInformation
)
{
PVOID hProcess
=
OperationInformation
-
>
Object
;
/
/
操作句柄
UCHAR
*
szImageName
=
PsGetProcessImageFileName((PEPROCESS)hProcess);
if
(
0
!
=
strcmp((const char
*
)szImageName,
"calc.exe"
))
{
return
OB_PREOP_SUCCESS;
}
/
/
区分操作类型
switch (OperationInformation
-
>Operation)
{
case OB_OPERATION_HANDLE_DUPLICATE:
KdPrint((
"OB_OPERATION_HANDLE_DUPLICATE\n"
));
break
;
case OB_OPERATION_HANDLE_CREATE:
KdPrint((
"OB_OPERATION_HANDLE_CREATE\n"
));
OperationInformation
-
>Parameters
-
>CreateHandleInformation.DesiredAccess
=
0
;
break
;
}
return
OB_PREOP_SUCCESS;
}
VOID PostProcessHandle(
_In_ PVOID RegistrationContext,
_In_ POB_POST_OPERATION_INFORMATION OperationInformation
)
{
}
extern
"C"
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegisterPath)
{
KdPrint((
"DriverEntry\n"
));
/
/
指定驱动卸载函数
pDriverObject
-
>DriverUnload
=
DriverUnload;
UNICODE_STRING usDeviceName;
/
/
设备对象名称
RtlInitUnicodeString(&usDeviceName, L
"\\Device\\ObTestDevice"
);
PDEVICE_OBJECT pDev;
NTSTATUS status;
status
=
IoCreateDevice(pDriverObject,
0
, &usDeviceName, FILE_DEVICE_UNKNOWN,
0
, true, &pDev);
if
(!NT_SUCCESS(status))
{
return
status;
}
pDev
-
>Flags |
=
DO_BUFFERED_IO;
OB_OPERATION_REGISTRATION obr;
obr.ObjectType
=
PsProcessType;
obr.Operations
=
OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
/
/
创建和复制
obr.PreOperation
=
PreProcessHandle;
obr.PostOperation
=
PostProcessHandle;
OB_CALLBACK_REGISTRATION ocr;
ocr.Version
=
OB_FLT_REGISTRATION_VERSION;
/
/
版本
ocr.RegistrationContext
=
NULL;
/
/
自定义数据
ocr.OperationRegistrationCount
=
1
;
/
/
回调函数个数
ocr.OperationRegistration
=
&obr;
RtlInitUnicodeString(&ocr.Altitude, L
"321000"
);
/
/
加载顺序
pRegistrationHandle
=
NULL;
if
(NT_SUCCESS(ObRegisterCallbacks(&ocr, &pRegistrationHandle)))
{
/
/
注册保护成功
KdPrint((
"Protect Success!!!"
));
}
else
{
/
/
注册保护失败
KdPrint((
"Protect Failure!!!"
));
}
return
STATUS_SUCCESS;
}