参考 《windows 驱动开发技术详解》,部分关于对象的结构,请看上节windbg命令 中介绍
公用头文件:
-
-
-
-
-
-
-
-
-
#pragma message("CTL_CODE undefined. Include winioctl.h or wdm.h")
-
-
-
#define IOCTL_DUMP_DEVICE_STACK CTL_CODE(\
-
-
-
-
-
-
ring3级代码
-
-
-
-
-
-
-
-
HANDLE hDevice = CreateFile("\\\\.\\KeListDeviceSL",
-
GENERIC_READ | GENERIC_WRITE,
-
-
-
-
-
-
if(hDevice == INVALID_HANDLE_VALUE)
-
-
printf("Failed to obtain file handle to device: "
-
"%s with Win32 error code: %d\n",
-
"MyWDMDevice", GetLastError() );
-
-
-
WCHAR* InputBuffer = L"\\Driver\\ACPI";
-
-
-
bRet = DeviceIoControl(hDevice,
-
-
-
-
-
-
-
-
-
-
ring0级代码
ListDevice.h
-
-
-
-
-
-
-
-
-
-
IN PUNICODE_STRING ObjectName,
-
-
IN PACCESS_STATE PassedAccessState OPTIONAL,
-
IN ACCESS_MASK DesiredAccess OPTIONAL,
-
IN POBJECT_TYPE ObjectType,
-
IN KPROCESSOR_MODE AccessMode,
-
IN OUT PVOID ParseContext OPTIONAL,
-
-
-
-
-
-
IoGetBaseFileSystemDeviceObject(
-
IN PFILE_OBJECT FileObject
-
-
extern POBJECT_TYPE IoDeviceObjectType;
-
extern POBJECT_TYPE *IoDriverObjectType;
-
-
-
-
-
-
-
#define MAX_FILE_LENGTH 1024
-
-
typedef struct _DEVICE_EXTENSION{
-
-
UNICODE_STRING ustrDeviceName;
-
UNICODE_STRING ustrSymLinkName;
-
-
-
-
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
-
-
-
-
NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject, UNICODE_STRING devname, UNICODE_STRING symLinkName);
-
-
VOID DriverUnload(PDRIVER_OBJECT pDriverObject);
-
-
NTSTATUS MyDispatchFunction(PDEVICE_OBJECT device, PIRP pIrp);
-
-
NTSTATUS DeviceIoControlDispatch(PDEVICE_OBJECT pDevObj, PIRP pIrp);
-
-
-
PDRIVER_OBJECT EnumDeviceStack(PWSTR pwszDeviceName);
-
-
typedef struct _OBJECT_CREATE_INFORMATION
-
-
-
-
-
KPROCESSOR_MODE ProbeMode;
-
-
ULONG NonPagedPoolCharge;
-
ULONG SecurityDescriptorCharge;
-
PSECURITY_DESCRIPTOR SecurityDescriptor;
-
PSECURITY_QUALITY_OF_SERVICE SecurityQos;
-
SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
-
}OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
-
-
typedef struct _OBJECT_HEADER
-
-
-
-
-
-
PSINGLE_LIST_ENTRY SEntry;
-
-
-
-
-
-
-
-
-
POBJECT_CREATE_INFORMATION ObjectCreateInfo;
-
-
-
PSECURITY_DESCRIPTOR SecurityDescriptor;
-
-
}OBJECT_HEADER, * POBJECT_HEADER;
-
-
#define NUMBER_HASH_BUCKETS 37
-
-
typedef struct _OBJECT_DIRECTORY
-
-
struct _OBJECT_DIRECTORY_ENTRY* HashBuckets[NUMBER_HASH_BUCKETS];
-
struct _OBJECT_DIRECTORY_ENTRY** LookupBucket;
-
-
USHORT SymbolicLinkUsageCount;
-
struct _DEVICE_MAP* DeviceMap;
-
} OBJECT_DIRECTORY, * POBJECT_DIRECTORY;
-
-
typedef struct _OBJECT_HEADER_NAME_INFO
-
-
POBJECT_DIRECTORY Directory;
-
-
-
-
-
LONG DbgDereferenceCount ;
-
-
} OBJECT_HEADER_NAME_INFO, * POBJECT_HEADER_NAME_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#define OBJECT_TO_OBJECT_HEADER( o ) \
-
CONTAINING_RECORD( (o), OBJECT_HEADER, Body )
-
-
#define OBJECT_HEADER_TO_NAME_INFO( oh ) ((POBJECT_HEADER_NAME_INFO) \
-
((oh)->NameInfoOffset == 0 ? NULL : ((PCHAR)(oh) - (oh)->NameInfoOffset)))
ListDevice.cpp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
-
-
DbgPrint("Enter DriverEntry\n");
-
-
-
pDriverObject->DriverUnload = DriverUnload;
-
for (int i = 0; i< IRP_MJ_MAXIMUM_FUNCTION; i++)
-
-
pDriverObject->MajorFunction[i] = MyDispatchFunction;
-
-
-
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceIoControlDispatch;
-
-
UNICODE_STRING ustrDevName, ustrSymbolicName;
-
RtlInitUnicodeString(&ustrDevName, L"\\Device\\KeListDevice");
-
RtlInitUnicodeString(&ustrSymbolicName, L"\\DosDevices\\KeListDeviceSL");
-
status = CreateDevice(pDriverObject, ustrDevName, ustrSymbolicName);
-
-
-
KdPrint(("Failed to Create Device ...\n"));
-
return STATUS_UNSUCCESSFUL;
-
-
KdPrint(("Exit DriverEntry\n"));
-
-
-
-
NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject, UNICODE_STRING devname, UNICODE_STRING symLinkName)
-
-
-
-
PDEVICE_EXTENSION pDevExt;
-
-
status = IoCreateDevice(pDriverObject,
-
sizeof(DEVICE_EXTENSION),
-
-
-
-
-
-
-
-
-
pDevObj->Flags |= DO_BUFFERED_IO;
-
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
-
pDevExt->pDevice = pDevObj;
-
pDevExt->ustrDeviceName = devname;
-
pDevExt->ustrSymLinkName = symLinkName;
-
-
-
status = IoCreateSymbolicLink(&symLinkName, &devname);
-
-
-
KdPrint(("Failed to IoCreateSymbolicLink and delete DeviceObject --- errorcode = %d ...\n",status));
-
-
-
-
-
-
-
VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
-
-
-
KdPrint(("Enter DriverUnload...\n"));
-
pNextObj = pDriverObject->DeviceObject;
-
-
-
-
-
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;
-
-
UNICODE_STRING LinkName = pDevExt->ustrSymLinkName;
-
IoDeleteSymbolicLink(&LinkName);
-
pNextObj = pNextObj->NextDevice;
-
IoDeleteDevice(pDevExt->pDevice);
-
-
-
-
NTSTATUS MyDispatchFunction(PDEVICE_OBJECT device, PIRP pIrp)
-
-
NTSTATUS status = STATUS_SUCCESS;
-
-
pIrp->IoStatus.Status = status;
-
pIrp->IoStatus.Information = 0;
-
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
-
KdPrint(("Leave MyDispatchFunction\n"));
-
-
-
-
NTSTATUS DeviceIoControlDispatch(PDEVICE_OBJECT pDevObj, PIRP pIrp)
-
-
-
NTSTATUS status = STATUS_SUCCESS;
-
-
KdPrint(("Enter DeviceIoControlDispatch...\n"));
-
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
-
ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
-
ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
-
-
ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
-
-
-
-
case IOCTL_DUMP_DEVICE_STACK:
-
-
KdPrint(("IOCTL_DUMP_DEVICE_STACK\n"));
-
WCHAR* InputBuffer = (WCHAR*)pIrp->AssociatedIrp.SystemBuffer;
-
EnumDeviceStack(InputBuffer);
-
-
-
status = STATUS_INVALID_VARIANT;
-
-
-
pIrp->IoStatus.Status = status;
-
pIrp->IoStatus.Information = info;
-
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
-
KdPrint(("Leave MyDispatchFunction\n"));
-
-
-
-
-
VOID GetDeviceObjectInfo(PDEVICE_OBJECT DevObj)
-
-
POBJECT_HEADER ObjectHeader;
-
POBJECT_HEADER_NAME_INFO ObjectNameInfo;
-
-
-
-
DbgPrint("DevObj is NULL!\n");
-
-
-
ObjectHeader = OBJECT_TO_OBJECT_HEADER(DevObj);
-
-
-
-
ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
-
if(ObjectNameInfo && ObjectNameInfo->Name.Buffer)
-
-
-
DbgPrint(" Driver Name : %wZ - Device Name :%wZ -Driver Address :0x%x - Device Address: 0x%x\n",
-
&(DevObj->DriverObject->DriverName),
-
-
-
-
-
-
else if (DevObj->DriverObject)
-
-
-
DbgPrint(" Driver Name : %wZ - Device Name :%wZ -Driver Address :0x%x - Device Address: 0x%x\n",
-
&(DevObj->DriverObject->DriverName),
-
-
-
-
-
-
-
-
-
VOID GetAttachedDeviceInfo(PDEVICE_OBJECT DevObj)
-
-
PDEVICE_OBJECT AtDeviceObject;
-
-
-
DbgPrint("DevObj is NULL!\n");
-
-
-
-
AtDeviceObject = DevObj->AttachedDevice;
-
-
-
-
DbgPrint( "Attached Driver Name:%wZ,Attached Driver Address:0x%x,Attached DeviceAddress:0x%x\n",
-
&(AtDeviceObject->DriverObject->DriverName),
-
AtDeviceObject->DriverObject,
-
-
AtDeviceObject = AtDeviceObject->AttachedDevice;
-
-
-
-
PDRIVER_OBJECT EnumDeviceStack(PWSTR pwszDeviceName)
-
-
UNICODE_STRING DriverName;
-
PDRIVER_OBJECT DriverObject = NULL;
-
PDEVICE_OBJECT DeviceObject = NULL;
-
-
RtlInitUnicodeString(&DriverName, pwszDeviceName);
-
-
ObReferenceObjectByName(&DriverName,
-
-
-
-
(POBJECT_TYPE)IoDriverObjectType,
-
-
-
-
-
-
-
-
DeviceObject = DriverObject->DeviceObject;
-
-
-
GetDeviceObjectInfo(DeviceObject);
-
-
if(DeviceObject->AttachedDevice)
-
GetAttachedDeviceInfo(DeviceObject);
-
-
-
if(DeviceObject->Vpb && DeviceObject->Vpb->DeviceObject)
-
-
GetDeviceObjectInfo(DeviceObject->Vpb->DeviceObject);
-
if(DeviceObject->Vpb->DeviceObject->AttachedDevice)
-
GetAttachedDeviceInfo(DeviceObject->Vpb->DeviceObject);
-
-
-
DeviceObject = DeviceObject->NextDevice;
-
-
-