从VXD中调用WDM的服务 作者:NUMEGA
Calling WDM Services from Windows 98 VxDs If you are developing VxDs specifically for Windows 98, you might occasionally need to call a WDM service from a VxD. The Windows 98 DDK has some limited support for doing this, although it isn't fully documented. In subdirectory lib\i386\free\win98 you'll find library wdmvxd.clb. This library gives you linkage to most if not all of the WDM entry points provided with Windows 98. Each of the object files loads registers and invokes INT 2Eh, which traps to a system dispatcher. Before invoking the called WDM service, the dispatcher takes care of ensuring that the stack is set up for structured exception handling, which is supported in WDM drivers. The library is set up to look like an import library, even though it does not result in any imports being generated. If you use DUMPBIN with the /linkermember switch, you'll see that the entry points are prefixed with __imp_. This was done so that you can use prototypes directly from wdm.h. For example, suppose you wanted to call RtlInitUnicodeString from a VxD. You would need this prototype from wdm.h: NTSYSAPI VOID NTAPI RtlInitUnicodeString( PUNICODE_STRING DestinationString, PCWSTR SourceString ); In addition, you may need these definitions: #define NTSYSAPI __declspec(dllimport) #define NTAPI __stdcall Then it's simply a matter of having the typedef's and linking against wdmvxd.clb. Use wdmvxd.clb only when absolutely necessary, and always with extreme caution. Because IRQL is largely undefined in VxDs, there are numerous ways to get into trouble when making these calls. -----------------------

|