阅读:2070回复:2
为什么用DriverWizard生成的DriverEntry只有一个参数
看了很多wdm的资料, 上面说的DriverEntry都有两个参数
DriverEntry ( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) 而用DriverWizard生成的只有一个参数, 这如何对应起来 NTSTATUS usbdrvtestDriver::DriverEntry(PUNICODE_STRING RegistryPath) ========================生成的相关程序如下(usbdrvtestDriver.cpp)========================= // usbdrvtestDriver.cpp // // Generated by DriverWizard 3.2.0 (Build 2485) // Requires DDK and DriverWorks // File created on 11/26/2012 // // This source file contains the implementation of a subclass of KDriver. // WDM drivers implement a subclass of KDriver and override member // function DriverEntry and AddDevice. // #define VDW_MAIN #include <vdw.h> #include <kusb.h> #include <kusbbusintf.h> #include "function.h" #include "usbdrvtestDriver.h" #include "usbdrvtestDevice.h" #pragma hdrstop("usbdrvtest.pch") // Memory allocation pool tag // Override this value using the global function SetPoolTag(). POOLTAG DefaultPoolTag('dbsu'); // Global driver trace object // TODO: Use KDebugOnlyTrace if you want trace messages // to appear only in checked builds. Use KTrace if // you want trace messages to always appear. Call // method SetOutputLevel to set the output threshold. KDebugOnlyTrace T("usbdrvtest"); /////////////////////////////////////////////////////////////////////////////////////////////////// // Begin INIT section #pragma code_seg("INIT") DECLARE_DRIVER_CLASS(usbdrvtestDriver, NULL) /////////////////////////////////////////////////////////////////////////////////////////////////// // usbdrvtestDriver::DriverEntry // This routine is called when the driver is loaded. Drivers often // read the registry for configurable parameters. // // Arguments: // IN RegistryPath // pointer to a unicode string representing the path to // driver-specific key in the registry. Look for: // HKLM\SYSTEM\CurrentControlSet\Services\usbdrvtest // // Return Value: // NTSTATUS code // NTSTATUS usbdrvtestDriver::DriverEntry(PUNICODE_STRING RegistryPath) { T.Trace(TraceInfo, __FUNCTION__"++. Compiled at " __TIME__ " on " __DATE__ "\n"); #ifdef DBG //DbgBreakPoint(); #endif NTSTATUS status = STATUS_SUCCESS; m_Unit = 0; // This macro suppresses compiler warning for unreferenced variable. // If you reference this parameter, simply remove the macro. UNREFERENCED_PARAMETER(RegistryPath); T.Trace(TraceInfo, __FUNCTION__"--. STATUS %x\n", status); return status; } /////////////////////////////////////////////////////////////////////////////////////////////////// #pragma code_seg() // end INIT code /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// // usbdrvtestDriver::AddDevice // This routine is called when the system detects a device for which this // driver is responsible. This function creates the Functional Device // Object, or FDO. The FDO enables this driver to handle requests for // the physical device. // // Arguments: // IN Pdo // Physical Device Object. This is a pointer to a system device // object that represents the physical device. // // Return Value: // NTSTATUS // NTSTATUS usbdrvtestDriver::AddDevice(PDEVICE_OBJECT Pdo) { T.Trace(TraceInfo, __FUNCTION__"++.\n"); NTSTATUS status = STATUS_SUCCESS; // Create usbdrvtestDevice using a form of "placement" new // that is a member operator of KDevice. This will use storage // in the system device object extension to store the class instance. usbdrvtestDevice* pDevice = new ( NULL, // no name FILE_DEVICE_UNKNOWN, NULL, // no name 0, DO_BUFFERED_IO | DO_POWER_PAGABLE ) usbdrvtestDevice(Pdo, m_Unit); if (pDevice == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; } else { status = pDevice->ConstructorStatus(); if (!NT_SUCCESS(status)) { delete pDevice; } else { m_Unit++; pDevice->ReportNewDevicePowerState(PowerDeviceD0); } } T.Trace(TraceInfo, __FUNCTION__"--. STATUS %x\n", status); return status; } /////////////////////////////////////////////////////////////////////////////////////////////////// // usbdrvtestDriver::Unload // This routine is called when the driver is unloaded. Delete any // device objects created in DriverEntry by calling base class method // Unload(). Cleanup any allocations made for registry values in // DriverEntry. // // Arguments: // none // // Return Value: // none // VOID usbdrvtestDriver::Unload(VOID) { T.Trace(TraceInfo, __FUNCTION__"++.\n"); // If you don't need to perform any functions // except to call the base class KDriver::Unload(), // then this entire routine may be safely deleted. // Call base class to delete all devices. KDriver::Unload(); T.Trace(TraceInfo, __FUNCTION__"--.\n"); } |
|
沙发#
发布于:2012-11-30 15:19
找到一些热心网友的参考, 先贴在这里
用DriverWorks生成的并不是标准的入口函数,而是在KDriver中的类函数,你可以看看 DriverWorks的帮助。 你的这段代码是书中的演示程序,如果非得强制放到DriverWorks生成的代码中不仅要看这本书 ,还要看DriverWorks帮助,查找Kdriver,KlowerDriver等函数,另外,使用DriverWorks的好 处是很多都被封装到了CLASS中,你无需关心,比如其中的AddDevice,在DriverWorks中已经定 义了这个函数,生成的代码只是继承过来的,所以我觉得如果你只是想调试这段程序,还是不 用DriverWorks生成的好,你可以自己写入代码,我也遇到了这样的问题,原来的程序就是 DriverWorks生成的,现在需要某些参数时不得不重载再DriverWorks的函数来获得。 希望我已经讲明白了 |
|
板凳#
发布于:2013-02-18 18:21
有邦助
|
|