USBCCGP 驱动结构

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");
}
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!