Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//
// Kernel-mode utility classes for minidrivers
//
#ifndef _UTIL_H_
#define _UTIL_H_
//
// _purecall must be defined in the main compile unit, not in a library
//
// the driver must define DECLARE_PURECALL once exactly somewhere
#ifdef DECLARE_PURECALL
// to handle pure virtual functions
// -- this is needed to complete the link, and can be
// called eg when a base class destructor calls a method
// that is only defined in a derived class.
//
// Alas it does not seem to be loaded correctly from a library
// and thus must be in the main module
extern "C" int _cdecl _purecall() { ASSERT(FALSE); return 0; }
#endif
#ifndef NO_GLOBAL_FUNCTION
extern BOOL StartThread(HANDLE hHandle, void(*p_Function)(void *), PVOID p_Context); extern BOOL StopThread(); extern void Delay(int iTime); extern PVOID AllocateFixedMemory(UINT uiSize); extern void FreeFixedMemory(PVOID p_vBuffer); extern void MemoryCopy(VOID *p_Destination, CONST VOID *p_Source, ULONG ulLength); extern NTSTATUS GetRegistryValue(IN HANDLE Handle, IN PWCHAR KeyNameString, IN ULONG KeyNameStringLength, IN PWCHAR Data, IN ULONG DataLength); extern BOOL StringsEqual(PWCHAR pwc1, PWCHAR pwc2); extern BOOL ConvertToNumber(PWCHAR sLine, PULONG pulNumber); extern BOOL ConvertNumberToString(PWCHAR sLine, ULONG ulNumber) ;
#endif // NO_GLOBAL_FUNCTION
// mutex wrapper and auto lock/unlock class
class CMutex { public: CMutex(ULONG level = 1) { KeInitializeMutex(&m_Mutex, level); }
void Lock() { KeWaitForSingleObject(&m_Mutex, Executive, KernelMode, false, NULL); }
void Unlock() { KeReleaseMutex(&m_Mutex, false); }
private: KMUTEX m_Mutex; };
// use c++ ctor/dtor framework to ensure unlocking
class CAutoMutex { public: CAutoMutex(CMutex* pLock) : m_pLock(pLock) { m_pLock->Lock(); } ~CAutoMutex() { m_pLock->Unlock(); } private: CMutex* m_pLock; };
class CPhilTimer { public: CPhilTimer(); ~CPhilTimer();
BOOL Set(int iTimePeriod); void Cancel(); BOOL Wait(int iTimeOut);
private: KTIMER m_Timer; };
#endif // _UTIL_H_
|