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.
 
 
 
 
 
 

424 lines
9.9 KiB

//#pragma hdrstop
/*++
Kernel mode definitions and function prototypes for wdm model
--*/
#ifndef WDM_INCD
#define WDM_INCD
#pragma PAGEDCODE
#ifdef __cplusplus
extern "C"{
#endif
#include <wdm.h>
#include <stdio.h>
#include <stdarg.h>
#ifndef IRP_MN_QUERY_LEGACY_BUS_INFORMATION
#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
#endif
#if DBG && defined(_X86_)
#undef ASSERT
#define ASSERT(e) if(!(e)){DbgPrint("Assertion failure in"\
__FILE__", line %d: " #e "\n", __LINE__);\
_asm int 3\
}
#endif
#define BOOL BOOLEAN
#define FALSE 0
typedef UCHAR* PBYTE;
#define MSEC *(-(LONGLONG)10000); //milliseconds
///////////////////////////////////////////////////////////////////////////////
/************************* LISTS MANIPULATION MACROS **************************/
// Doubly-linked list manipulation routines. Implemented as macros
// but logically these are procedures.
/*
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY * volatile Flink;
struct _LIST_ENTRY * volatile Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
*/
#ifndef LIST_ENTRY_DEF
#define LIST_ENTRY_DEF
// VOID
// InitializeListHead(
// PLIST_ENTRY ListHead
// );
#define InitializeListHead(ListHead) (\
(ListHead)->Flink = (ListHead)->Blink = (ListHead))
// BOOLEAN
// IsListEmpty(
// PLIST_ENTRY ListHead
// );
#define IsListEmpty(ListHead) \
((ListHead)->Flink == (ListHead))
// PLIST_ENTRY
// RemoveHeadList(
// PLIST_ENTRY ListHead
// );
#define RemoveHeadList(ListHead) \
(ListHead)->Flink;\
{RemoveEntryList((ListHead)->Flink)}
// PLIST_ENTRY
// RemoveTailList(
// PLIST_ENTRY ListHead
// );
#define RemoveTailList(ListHead) \
(ListHead)->Blink;\
{RemoveEntryList((ListHead)->Blink)}
// VOID
// RemoveEntryList(
// PLIST_ENTRY Entry
// );
#define RemoveEntryList(Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_Flink;\
_EX_Flink = (Entry)->Flink;\
_EX_Blink = (Entry)->Blink;\
_EX_Blink->Flink = _EX_Flink;\
_EX_Flink->Blink = _EX_Blink;\
}
// VOID
// InsertTailList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
#define InsertTailList(ListHead,Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Blink = _EX_ListHead->Blink;\
(Entry)->Flink = _EX_ListHead;\
(Entry)->Blink = _EX_Blink;\
_EX_Blink->Flink = (Entry);\
_EX_ListHead->Blink = (Entry);\
}
// VOID
// InsertHeadList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
#define InsertHeadList(ListHead,Entry) {\
PLIST_ENTRY _EX_Flink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Flink = _EX_ListHead->Flink;\
(Entry)->Flink = _EX_Flink;\
(Entry)->Blink = _EX_ListHead;\
_EX_Flink->Blink = (Entry);\
_EX_ListHead->Flink = (Entry);\
}
// PSINGLE_LIST_ENTRY
// PopEntryList(
// PSINGLE_LIST_ENTRY ListHead
// );
#define PopEntryList(ListHead) \
(ListHead)->Next;\
{\
PSINGLE_LIST_ENTRY FirstEntry;\
FirstEntry = (ListHead)->Next;\
if (FirstEntry != NULL) { \
(ListHead)->Next = FirstEntry->Next;\
} \
}
// VOID
// PushEntryList(
// PSINGLE_LIST_ENTRY ListHead,
// PSINGLE_LIST_ENTRY Entry
// );
#define PushEntryList(ListHead,Entry) \
(Entry)->Next = (ListHead)->Next; \
(ListHead)->Next = (Entry)
#endif //LIST_ENTRY
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(ULONG_PTR)(&((type *)0)->field)))
#endif
/*******************************************************************************/
#ifndef FIELDOFFSET
#define FIELDOFFSET(type, field) ((DWORD)(&((type *)0)->field))
#endif
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(ULONG_PTR)(&((type *)0)->field)))
#endif
/**********************************************************************************/
#ifdef __cplusplus
}
#endif
// Macros to verify allocated objects
#define ALLOCATED_OK(obj) \
((obj!=(VOID *)0) && NT_SUCCESS((obj)->m_Status))
#define DISPOSE_OBJECT(obj) \
{if((obj!=(VOID *)0)) obj->dispose(); obj = NULL;}
#define RETURN_VERIFIED_OBJECT(obj) \
if(ALLOCATED_OK(obj)) return obj; \
else \
{ \
DISPOSE_OBJECT(obj); \
return NULL; \
}
// derived class Unicode string
#define TYPE_SYSTEM_ALLOCATED 0
#define TYPE_DRIVER_ALLOCATED 1
extern ULONG ObjectCounter;
//::DBG_PRINT("=== Deleting Object %8.8lX",ptr);\
// Overrides for library new and delete operators.
/*
inline VOID* __cdecl operator new(ULONG size, POOL_TYPE iType)\
{PVOID pMem; if(pMem = ::ExAllocatePoolWithTag(iType,size,'_GRU'))\
{ ObjectCounter++; ::RtlZeroMemory(pMem,size); DBG_PRINT("\n=== New Object %8.8lX, %d\n",pMem,ObjectCounter);\
return pMem; \
} else return NULL; };
inline VOID __cdecl operator delete(VOID* ptr)\
{ if(ptr){ObjectCounter--; DBG_PRINT("\n=== Deleting Object %8.8lX, %d\n",ptr,ObjectCounter); ::ExFreePool((PVOID)ptr);}\
};
*/
#pragma LOCKEDCODE
inline VOID* __cdecl operator new(size_t size, POOL_TYPE iType)\
{PVOID pMem; if(pMem = ::ExAllocatePoolWithTag(iType,size,'URG_'))\
{ ObjectCounter++; ::RtlZeroMemory(pMem,size);\
return pMem; \
} else return NULL; };
inline VOID __cdecl operator delete(VOID* ptr)\
{ if(ptr){ObjectCounter--; ::ExFreePool((PVOID)ptr);}\
};
#include "generic.h"
#pragma PAGEDCODE
template <class T>
class CLinkedList
{
public:
NTSTATUS m_Status;
VOID self_delete(VOID){delete this;};
virtual VOID dispose(VOID){self_delete();};
protected:
LIST_ENTRY head;
KSPIN_LOCK splock;
public:
CLinkedList()
{
InitializeListHead(&head);
KeInitializeSpinLock(&splock);
};
BOOLEAN IsEmpty(VOID) { return IsListEmpty(&head); };
~CLinkedList()
{ // if list is still not empty, free all items
T *p;
while (p=(T *) ExInterlockedRemoveHeadList(&head,&splock))
{
CONTAINING_RECORD(p,T,entry)->dispose();
}
};
VOID New(T *p)
{
ExInterlockedInsertTailList(&head,&(p->entry),&splock);
};
VOID insertHead(T *p)
{
ExInterlockedInsertHeadList(&head,&(p->entry),&splock);
};
T* removeHead(VOID)
{
T *p=(T *) ExInterlockedRemoveHeadList(&head,&splock);
if (p) p=CONTAINING_RECORD(p,T,entry);
return p;
};
VOID remove(T *p)
{
RemoveEntryList(&(p->entry));
};
T* getNext(T* p)
{
if (p)
{
PLIST_ENTRY Next;
Next = p->entry.Flink;
if (Next && (Next!= &head))
{
T* pp=CONTAINING_RECORD(Next,T,entry);
return pp;
}
else return NULL;
}
return NULL;
};
T* getFirst()
{
PLIST_ENTRY Next = head.Flink;
if (Next && Next!= &head)
{
T* p = CONTAINING_RECORD(Next,T,entry);
return p;
}
return NULL;
};
};
#pragma PAGEDCODE
class CUString
{
public:
NTSTATUS m_Status;
VOID self_delete(VOID){delete this;};
virtual VOID dispose(VOID){self_delete();};
private:
UCHAR m_bType;
public:
UNICODE_STRING m_String;
public:
CUString(USHORT nSize)
{
m_Status = STATUS_INSUFFICIENT_RESOURCES;
m_bType = TYPE_DRIVER_ALLOCATED;
RtlInitUnicodeString(&m_String,NULL);
m_String.MaximumLength = nSize;
m_String.Buffer = (USHORT *)
ExAllocatePool(PagedPool,nSize);
if (!m_String.Buffer) return; // leaving status the way it is
RtlZeroMemory(m_String.Buffer,m_String.MaximumLength);
m_Status = STATUS_SUCCESS;
};
CUString(PWCHAR uszString)
{
m_Status = STATUS_SUCCESS;
m_bType = TYPE_SYSTEM_ALLOCATED;
RtlInitUnicodeString(&m_String,uszString);
};
CUString(ANSI_STRING* pString)
{
m_Status = STATUS_SUCCESS;
m_bType = TYPE_SYSTEM_ALLOCATED;
RtlAnsiStringToUnicodeString(&m_String,pString,TRUE);
};
CUString(PCSTR pString)
{
ANSI_STRING AnsiString;
m_Status = STATUS_SUCCESS;
m_bType = TYPE_SYSTEM_ALLOCATED;
RtlInitAnsiString(&AnsiString,pString);
RtlAnsiStringToUnicodeString(&m_String,&AnsiString,TRUE);
};
CUString(PUNICODE_STRING uString)
{
m_Status = STATUS_INSUFFICIENT_RESOURCES;
m_bType = TYPE_DRIVER_ALLOCATED;
RtlInitUnicodeString(&m_String,NULL);
m_String.MaximumLength = MAXIMUM_FILENAME_LENGTH;
m_String.Buffer = (USHORT *)
ExAllocatePool(PagedPool,MAXIMUM_FILENAME_LENGTH);
if (!m_String.Buffer) return; // leaving status the way it is
RtlZeroMemory(m_String.Buffer,m_String.MaximumLength);
RtlCopyUnicodeString(&m_String,uString);
m_Status = STATUS_SUCCESS;
};
CUString(LONG iVal, LONG iBase)
{
m_Status = STATUS_INSUFFICIENT_RESOURCES;
m_bType = TYPE_DRIVER_ALLOCATED;
RtlInitUnicodeString(&m_String,NULL);
USHORT iSize=1;
LONG iValCopy=(!iVal)?1:iVal;
while (iValCopy>=1)
{
iValCopy/=iBase;
iSize++;
} // now iSize carries the number of digits
iSize*=sizeof(WCHAR);
m_String.MaximumLength = iSize;
m_String.Buffer = (USHORT *)
ExAllocatePool(PagedPool,iSize);
if (!m_String.Buffer) return;
RtlZeroMemory(m_String.Buffer,m_String.MaximumLength);
m_Status = RtlIntegerToUnicodeString(iVal, iBase, &m_String);
};
~CUString()
{
if ((m_bType == TYPE_DRIVER_ALLOCATED) && m_String.Buffer)
ExFreePool(m_String.Buffer);
};
VOID append(UNICODE_STRING *uszString)
{
m_Status = RtlAppendUnicodeStringToString(&m_String,uszString);
};
VOID copyTo(CUString *pTarget)
{
RtlCopyUnicodeString(&pTarget->m_String,&m_String);
};
BOOL operator==(CUString cuArg)
{
return (!RtlCompareUnicodeString(&m_String,
&cuArg.m_String,FALSE));
};
LONG inline getLength() { return m_String.Length; };
PWCHAR inline getString() { return m_String.Buffer; };
VOID inline setLength(USHORT i) { m_String.Length = i; };
};
// already included
#endif