佚名通过本文主要向大家介绍了driverentry,ntstatus driverentry,pci驱动程序下载,pci驱动程序,pci桥设备驱动程序等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 我的PCI驱动程序执行完DriverEntry后直接进入到DriverUnload了
描述:
我的DriverEntry函数内容如下:
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
WDF_DRIVER_CONFIG config;
NTSTATUS status;
WDF_INTERRUPT_CONFIG interruptConfig;
WDFDEVICE control_device;
PDEVICE_CONTEXT deviceContext;
WDF_OBJECT_ATTRIBUTES attributes;
PWDFDEVICE_INIT device_init = NULL;
PDEVICE_OBJECT dev = NULL;
WDFDRIVER drv = NULL;//wdf framework 驱动对象
UNICODE_STRING ustring;
WDF_IO_QUEUE_CONFIG ioQueueConfig;
WDF_FILEOBJECT_CONFIG f_config;
DEVICE_CONTEXT* dev_ctx = NULL;
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
//
// Initialize WPP Tracing
//
DbgPrintEx(DPFLTR_DEFAULT_ID, DPFLTR_INFO_LEVEL, "this is in DriverEntry!\n");
//注册提供程序 GUID 并初始化内核模式驱动程序或用户模式应用程序中软件跟踪所需的结构
WPP_INIT_TRACING(DriverObject, RegistryPath);
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DRIVER_CONTEXT);
//对于一些对象,因为包含配置结构,因此需要先初始化配置结构,然后再调用创建函数
WDF_DRIVER_CONFIG_INIT(&config, //初始化配置结构,设置EvtDriverDeviceAdd例程地址
PCIdriverEvtDeviceAdd //为NULL表示不提供AddDevice函数
);
config.EvtDriverUnload = EvtDriverUnload;
status = WdfDriverCreate(DriverObject, //创建对象
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES,//&attributes,
&config,
WDF_NO_HANDLE//&drv,WdfDriverCreate把创建对象产生的句柄可选的返回给创建好的WDFDRIVER对象
);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, TRACE_DRIVER, "WdfDriverCreate failed %!STATUS!", status);
WPP_CLEANUP(DriverObject);
return status;
}
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit");
return status;
}
我的DriverUnload函数内容如下:
VOID EvtDriverUnload(
IN WDFDRIVER Driver)
{
KdPrint(("unload driver\n"));
KdPrint(("Doesn't need to clean up the devices, since we only have control device here\n"));
//遍历设备对象列表,删除设备,并删除符号链接
}
EvtDeviceAdd函数内容如下:
NTSTATUS
PCIdriverEvtDeviceAdd(
_In_ WDFDRIVER Driver,
_Inout_ PWDFDEVICE_INIT DeviceInit
)
{
NTSTATUS status;
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
UNICODE_STRING ustring;
WDF_FILEOBJECT_CONFIG f_config;
WDF_OBJECT_ATTRIBUTES attributes;
WDFDEVICE control_device;
WDF_IO_QUEUE_CONFIG ioQueueConfig;
WDF_INTERRUPT_CONFIG interruptConfig;
PDEVICE_CONTEXT deviceContext;
UNREFERENCED_PARAMETER(Driver);
PAGED_CODE();
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");
//设置I/O类型,采用WdfDeviceIoDirect方式,该函数必须在WdfDeviceCreate之前调用,否则系统会蓝屏并重新启动
WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);
//status = PCIdriverCreateDevice(DeviceInit);
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
//注册即插即用基本例程
pnpPowerCallbacks.EvtDevicePrepareHardware = PCIDriverEvtDevicePrepareHardware;
pnpPowerCallbacks.EvtDeviceReleaseHardware = PCIDriverEvtDeviceReleaseHardware;
//注册驱动的即插即用和电源管理事件回调函数
pnpPowerCallbacks.EvtDeviceD0Entry = PCIDriverEvtDeviceDOEntry;
pnpPowerCallbacks.EvtDeviceD0Exit = PCIDriverEvtDeviceDOExit;
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
//用GPS_DEVICE_NAME来初始化UNICODE_STRING结构体ustring
RtlInitUnicodeString(&ustring, GPS_DEVICE_NAME);
//为设备指定一个名称,内核模式下,名字类似L"\\Device\\PCI_SZK"
status = WdfDeviceInitAssignName(DeviceInit, &ustring);
if (!NT_SUCCESS(status))
{
KdPrint(("WdfDeviceInitAssignName Fail\n"));
return status;
}
WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);
//配置FILEOBJECT配置文件,设置FILECREATE,FILECLOSE回调,这里最后一个参数为NULL,说明没有提供EvtFileCleanup回调
WDF_FILEOBJECT_CONFIG_INIT(&f_config, EvtDeviceFileCreate, EvtFileClose, NULL);
//将FILEOBJECT的设置记录到device_init中
WdfDeviceInitSetFileObjectConfig(DeviceInit, &f_config, WDF_NO_OBJECT_ATTRIBUTES);
//初始化设备对象特性结构
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);
//根据前面创建的device_init来创建一个设备
status = WdfDeviceCreate(&DeviceInit, &attributes, &control_device);//返回control_device中WDFDEVICE对象的句柄
if (!NT_SUCCESS(status)) {
return status;
}
//创建设备GUID接口
status = WdfDeviceCreateDeviceInterface(control_device, (LPGUID)&GUID_DEVINTERFACE_PCIdriver, NULL);
if (!NT_SUCCESS(status)) {
KdPrint(("Failed to create GUID interface\n"));
return status;
}
//初始化默认队列配置,KMDF会把所有读,写和设备I/O控制请求放入默认队列中
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(
&ioQueueConfig,
WdfIoQueueDispatchParallel //设置I/O请求分发方式为并行
);
ioQueueConfig.EvtIoDeviceControl = PCIdriverEvtIoDeviceControl;
ioQueueConfig.EvtIoStop = PCIdriverEvtIoStop;
ioQueueConfig.EvtIoWrite = PCIDriverEvtIoWrite;
ioQueueConfig.EvtIoRead = PCIDriverEvtIoRead;
status = WdfIoQueueCreate( //创建队列对象
control_device,
&ioQueueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
NULL//&dev_ctx->_DefaultQueue
);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, TRACE_QUEUE, "WdfIoQueueCreate failed %!STATUS!", status);
return status;
}
//创建符号连接,这样用户模式下的程序可以使用这个驱动。
//这个是必须的,不然用户模式下的程序不能访问这个设备。
RtlInitUnicodeString(&ustring, GPS_SYMBOL_NAME);
status = WdfDeviceCreateSymbolicLink(control_device, &ustring);
if (!NT_SUCCESS(status))
{
KdPrint(("Failed to create Link\n"));
return status;
}
WdfControlFinishInitializing(control_device); //创建设备完成
deviceContext = GetDeviceContext2(control_device);
//设置中断服务例程和延迟过程调用
WDF_INTERRUPT_CONFIG_INIT(&interruptConfig,
PCIDriverEvtInterruptIsr,
PCIDriverEvtInterruptDpc);
//创建中断对象
status = WdfInterruptCreate(control_device,
&interruptConfig,
WDF_NO_OBJECT_ATTRIBUTES,
&deviceContext->Interrupt);
if (!NT_SUCCESS(s
描述:
驱动DriverEntryDriverUnload
问题:我的PCI驱动程序执行完DriverEntry后直接进入到DriverUnload了我的DriverEntry函数内容如下:
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
WDF_DRIVER_CONFIG config;
NTSTATUS status;
WDF_INTERRUPT_CONFIG interruptConfig;
WDFDEVICE control_device;
PDEVICE_CONTEXT deviceContext;
WDF_OBJECT_ATTRIBUTES attributes;
PWDFDEVICE_INIT device_init = NULL;
PDEVICE_OBJECT dev = NULL;
WDFDRIVER drv = NULL;//wdf framework 驱动对象
UNICODE_STRING ustring;
WDF_IO_QUEUE_CONFIG ioQueueConfig;
WDF_FILEOBJECT_CONFIG f_config;
DEVICE_CONTEXT* dev_ctx = NULL;
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
//
// Initialize WPP Tracing
//
DbgPrintEx(DPFLTR_DEFAULT_ID, DPFLTR_INFO_LEVEL, "this is in DriverEntry!\n");
//注册提供程序 GUID 并初始化内核模式驱动程序或用户模式应用程序中软件跟踪所需的结构
WPP_INIT_TRACING(DriverObject, RegistryPath);
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DRIVER_CONTEXT);
//对于一些对象,因为包含配置结构,因此需要先初始化配置结构,然后再调用创建函数
WDF_DRIVER_CONFIG_INIT(&config, //初始化配置结构,设置EvtDriverDeviceAdd例程地址
PCIdriverEvtDeviceAdd //为NULL表示不提供AddDevice函数
);
config.EvtDriverUnload = EvtDriverUnload;
status = WdfDriverCreate(DriverObject, //创建对象
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES,//&attributes,
&config,
WDF_NO_HANDLE//&drv,WdfDriverCreate把创建对象产生的句柄可选的返回给创建好的WDFDRIVER对象
);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, TRACE_DRIVER, "WdfDriverCreate failed %!STATUS!", status);
WPP_CLEANUP(DriverObject);
return status;
}
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit");
return status;
}
我的DriverUnload函数内容如下:
VOID EvtDriverUnload(
IN WDFDRIVER Driver)
{
KdPrint(("unload driver\n"));
KdPrint(("Doesn't need to clean up the devices, since we only have control device here\n"));
//遍历设备对象列表,删除设备,并删除符号链接
}
EvtDeviceAdd函数内容如下:
NTSTATUS
PCIdriverEvtDeviceAdd(
_In_ WDFDRIVER Driver,
_Inout_ PWDFDEVICE_INIT DeviceInit
)
{
NTSTATUS status;
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
UNICODE_STRING ustring;
WDF_FILEOBJECT_CONFIG f_config;
WDF_OBJECT_ATTRIBUTES attributes;
WDFDEVICE control_device;
WDF_IO_QUEUE_CONFIG ioQueueConfig;
WDF_INTERRUPT_CONFIG interruptConfig;
PDEVICE_CONTEXT deviceContext;
UNREFERENCED_PARAMETER(Driver);
PAGED_CODE();
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");
//设置I/O类型,采用WdfDeviceIoDirect方式,该函数必须在WdfDeviceCreate之前调用,否则系统会蓝屏并重新启动
WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);
//status = PCIdriverCreateDevice(DeviceInit);
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
//注册即插即用基本例程
pnpPowerCallbacks.EvtDevicePrepareHardware = PCIDriverEvtDevicePrepareHardware;
pnpPowerCallbacks.EvtDeviceReleaseHardware = PCIDriverEvtDeviceReleaseHardware;
//注册驱动的即插即用和电源管理事件回调函数
pnpPowerCallbacks.EvtDeviceD0Entry = PCIDriverEvtDeviceDOEntry;
pnpPowerCallbacks.EvtDeviceD0Exit = PCIDriverEvtDeviceDOExit;
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
//用GPS_DEVICE_NAME来初始化UNICODE_STRING结构体ustring
RtlInitUnicodeString(&ustring, GPS_DEVICE_NAME);
//为设备指定一个名称,内核模式下,名字类似L"\\Device\\PCI_SZK"
status = WdfDeviceInitAssignName(DeviceInit, &ustring);
if (!NT_SUCCESS(status))
{
KdPrint(("WdfDeviceInitAssignName Fail\n"));
return status;
}
WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);
//配置FILEOBJECT配置文件,设置FILECREATE,FILECLOSE回调,这里最后一个参数为NULL,说明没有提供EvtFileCleanup回调
WDF_FILEOBJECT_CONFIG_INIT(&f_config, EvtDeviceFileCreate, EvtFileClose, NULL);
//将FILEOBJECT的设置记录到device_init中
WdfDeviceInitSetFileObjectConfig(DeviceInit, &f_config, WDF_NO_OBJECT_ATTRIBUTES);
//初始化设备对象特性结构
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);
//根据前面创建的device_init来创建一个设备
status = WdfDeviceCreate(&DeviceInit, &attributes, &control_device);//返回control_device中WDFDEVICE对象的句柄
if (!NT_SUCCESS(status)) {
return status;
}
//创建设备GUID接口
status = WdfDeviceCreateDeviceInterface(control_device, (LPGUID)&GUID_DEVINTERFACE_PCIdriver, NULL);
if (!NT_SUCCESS(status)) {
KdPrint(("Failed to create GUID interface\n"));
return status;
}
//初始化默认队列配置,KMDF会把所有读,写和设备I/O控制请求放入默认队列中
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(
&ioQueueConfig,
WdfIoQueueDispatchParallel //设置I/O请求分发方式为并行
);
ioQueueConfig.EvtIoDeviceControl = PCIdriverEvtIoDeviceControl;
ioQueueConfig.EvtIoStop = PCIdriverEvtIoStop;
ioQueueConfig.EvtIoWrite = PCIDriverEvtIoWrite;
ioQueueConfig.EvtIoRead = PCIDriverEvtIoRead;
status = WdfIoQueueCreate( //创建队列对象
control_device,
&ioQueueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
NULL//&dev_ctx->_DefaultQueue
);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, TRACE_QUEUE, "WdfIoQueueCreate failed %!STATUS!", status);
return status;
}
//创建符号连接,这样用户模式下的程序可以使用这个驱动。
//这个是必须的,不然用户模式下的程序不能访问这个设备。
RtlInitUnicodeString(&ustring, GPS_SYMBOL_NAME);
status = WdfDeviceCreateSymbolicLink(control_device, &ustring);
if (!NT_SUCCESS(status))
{
KdPrint(("Failed to create Link\n"));
return status;
}
WdfControlFinishInitializing(control_device); //创建设备完成
deviceContext = GetDeviceContext2(control_device);
//设置中断服务例程和延迟过程调用
WDF_INTERRUPT_CONFIG_INIT(&interruptConfig,
PCIDriverEvtInterruptIsr,
PCIDriverEvtInterruptDpc);
//创建中断对象
status = WdfInterruptCreate(control_device,
&interruptConfig,
WDF_NO_OBJECT_ATTRIBUTES,
&deviceContext->Interrupt);
if (!NT_SUCCESS(s