windows-nt/Source/XPSP1/NT/drivers/wdm/bda/samples/mauitune/util.h
2020-09-26 16:20:57 +08:00

98 lines
2.2 KiB
C++

//
// 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_