|
|
//////////////////////////////////////////////////////////////////////////////
//
// (C) Philips Semiconductors-CSU 1999
// All rights are reserved. Reproduction in whole or in part is prohibited
// without the written consent of the copyright owner.
//
// Philips reserves the right to make changes without notice at any time.
// Philips makes no warranty, expressed, implied or statutory, including but
// not limited to any implied warranty of merchantibility or fitness for any
// particular purpose, or that the use will not infringe any third party
// patent, copyright or trademark. Philips must not be liable for any loss
// or damage arising from its use.
//
// UTIL.CPP
//////////////////////////////////////////////////////////////////////////////
#define DECLARE_PURECALL
#include "common.h"
#define NO_GLOBAL_FUNCTION
#include "wdmdrv.h"
#include "util.h"
// global space functions definition
// Thread related functions
BOOL StartThread(HANDLE hHandle, void(*p_Function)(void *), PVOID p_Context); BOOL StopThread();
void Delay(int iTime);
// Memory related functions
PVOID AllocateFixedMemory(UINT uiSize); void FreeFixedMemory(PVOID p_vBuffer); void MemoryCopy(VOID *p_Destination, CONST VOID *p_Source, ULONG ulLength);
// Registry related functions
NTSTATUS GetRegistryValue(IN HANDLE Handle, IN PWCHAR KeyNameString, IN ULONG KeyNameStringLength, IN PWCHAR Data, IN ULONG DataLength); BOOL StringsEqual(PWCHAR pwc1, PWCHAR pwc2); BOOL ConvertToNumber(PWCHAR sLine, PULONG pulNumber); BOOL ConvertNumberToString(PWCHAR sLine, ULONG ulNumber) ;
/*
* StringsEqual() * Input: PWCHAR pwc1 - First string to compare. PWCHAR pwc2 - Second string to compare. * Output: TRUE - if equal else FALSE * Description: Compares to UNICODE srings and checks if they are equal */ BOOL StringsEqual(PWCHAR pwc1, PWCHAR pwc2) { UNICODE_STRING us1, us2;
RtlInitUnicodeString(&us1, pwc1); RtlInitUnicodeString(&us2, pwc2);
// case INsensitive
return (RtlEqualUnicodeString(&us1, &us2, TRUE)); }
/*
* ConvertToNumber() * Input: PWCHAR sLine - String to parse. * PULONG pulNumber - Reference to variable to store the value. * Output: TRUE if operation succeeded else FALSE * Description: Converts UNICODE string to integer */ BOOL ConvertToNumber(PWCHAR sLine, PULONG pulNumber) { UNICODE_STRING usLine;
RtlInitUnicodeString(&usLine, sLine);
if (!(NT_SUCCESS(RtlUnicodeStringToInteger(&usLine, 0, pulNumber)))) return FALSE;
return TRUE; }
/*
* ConvertNumberToString() * Input: PWCHAR sLine - String to store. * ULONG ulNumber - Number to convert. * * Output: TRUE if operation succeeded else FALSE * Description: Converts integer to UNICODE string */ BOOL ConvertNumberToString(PWCHAR sLine, ULONG ulNumber) { UNICODE_STRING UnicodeString; RtlInitUnicodeString(&UnicodeString, sLine); if (!(NT_SUCCESS(RtlIntegerToUnicodeString(ulNumber, 10, &UnicodeString)))) return FALSE;
return TRUE;
}
/*
* Delay() * Input: int iTime : its the delay required in musec * Output: * Description: Introduces delay corresponding to parameter passed */ void Delay(int iTime) { LARGE_INTEGER liTime; liTime.QuadPart = 0 - (iTime * 10);
// uses time in units of 100ns
KeDelayExecutionThread(KernelMode, FALSE, &liTime); }
BOOL StartThread(HANDLE hHandle, void(*p_Function)(void *), PVOID p_Context) { if(PsCreateSystemThread( &hHandle, 0L, NULL, NULL, NULL, p_Function, p_Context) == STATUS_SUCCESS) return TRUE; else return FALSE; }
BOOL StopThread() { PsTerminateSystemThread(STATUS_SUCCESS); return TRUE; }
PVOID AllocateFixedMemory(UINT uiSize) { return ExAllocatePool(NonPagedPool, uiSize); }
void FreeFixedMemory(PVOID p_vBuffer) { ExFreePool(p_vBuffer); }
void MemoryCopy(VOID *p_Destination, CONST VOID *p_Source, ULONG ulLength) { RtlCopyMemory(p_Destination, p_Source, ulLength); }
/********************* TIMER RELATED FUNCTIONS ********************/
CPhilTimer::CPhilTimer() { }
CPhilTimer::~CPhilTimer() { KeCancelTimer(&m_Timer); }
BOOL CPhilTimer::Set(int iTimePeriod) { // Initialize and start timer
KeInitializeTimerEx(&m_Timer, SynchronizationTimer);
int iTime = iTimePeriod/1000; // Set timer to occur every "uiTimePeriod" microseconds
LARGE_INTEGER liTime; liTime.QuadPart = (LONGLONG)(0-(iTimePeriod * 10)); if(!KeSetTimerEx(&m_Timer, liTime, iTime, NULL)) return FALSE; return TRUE; }
void CPhilTimer::Cancel() { KeCancelTimer(&m_Timer); }
BOOL CPhilTimer::Wait(int iTimeOut) { LARGE_INTEGER liTime; liTime.QuadPart = (LONGLONG)(0-(iTimeOut * 10)); if (KeWaitForSingleObject(&m_Timer, Executive, KernelMode, FALSE, &liTime) == STATUS_TIMEOUT) return FALSE; else return TRUE; }
|