202 lines
4.8 KiB
C++
202 lines
4.8 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// (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;
|
|
}
|
|
|
|
|
|
|