USBCCGP 驱动结构
2021-09-15
854
0
USBCCGP驱动文件结构
USBCCGP驱动位于REACTOS的ReactOS-0.4.0\drivers\usb\usbccgp
目录下,包含文件
descriptor.c
fdo.c
function.c
guid.c
misc.c
pdo.c
usbccgp.c
usbccgp.h
usbccgp.rc
USBCCGAP驱动代码结构
USBCCGAP入口函数DriverEntry
入口函数DriverEntry
就位于usbccgp.c中,其功能是初始化IRP的回调函数指针,并实现各个回调函数代码实现。
usbccgp.c
NTSTATUS
NTAPI
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
{
/* Initialize driver object */
DPRINT("[USBCCGP] DriverEntry\n");
DriverObject->DriverExtension->AddDevice = USBCCGP_AddDevice;
DriverObject->MajorFunction[IRP_MJ_CREATE] = USBCCGP_Dispatch;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBCCGP_Dispatch;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBCCGP_Dispatch;
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = USBCCGP_Dispatch;
DriverObject->MajorFunction[IRP_MJ_POWER] = USBCCGP_Dispatch;
DriverObject->MajorFunction[IRP_MJ_PNP] = USBCCGP_Dispatch;
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = USBCCGP_Dispatch;
DriverObject->DriverUnload = USBCCGP_Unload;
/* FIMXE query GenericCompositeUSBDeviceString */
return STATUS_SUCCESS;
}
通过代码可以看出,DRIVER_OBJECT 中,除过FDO创建的调函数AddDevice和驱动的卸载函数DriverUnload,各个IRP的回函数都设置为USBCCGP_Dispatch。
这样当无论是上层应用打开本驱动或者USBCCGP的创建的PDO设备被加载了FDO后,在其子设备的FDO中,系统发出IRP请求后,最终调用USBCCGP_Dispatch
来完成了。
当然
USBCCGP_Dispatch
不可能完成这么多的功能,仅为所有IRP的一个入口函数,在其内部会根据IRP和其来源不同进行二次派发。
IRP_MJ_INTERNAL_DEVICE_CONTROL不同于一般的IRP_MJ_CREATE有与其对应的API函数,这个IRP一般用于驱动内部的通讯,如上层驱动与下层驱动的调用。除过这些,当然最重要的就是IRP_MJ_PNP了,IRP_MJ_PNP实现与驱动的功能接口,而IRP_MJ_CREATE之类会实现与驱动功能接口。
USBCCGAP驱动的卸载函数
驱动的卸载函数很简单,就是一个空函数。
很明显这是一个WDM驱动,设备在卸载时会调发生主功能号为IRP_MJ_PNP,而次功能号为IRP_MN_REMOVE_DEVICE的IRP,而USBCCGP_Unload只是负责一些整个驱动的资源清理工作,由于在驱动初始化时并无任何资源申请,所以在此也就没有任何资源的释放了。
usbccgp.c
VOID
NTAPI
USBCCGP_Unload(PDRIVER_OBJECT DriverObject)
{
DPRINT("[USBCCGP] Unload\n");
}
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936