CeLogImportTable_V5 (Compact 2013)
3/28/2014
Windows Embedded Compact supports a CeLogImportTable_V5 structure for use with IOCTL_CELOG_IMPORT. For more information, see IOCTL_CELOG_IMPORT.
This structure and the previous CeLogImportTable structure, version 4, differ in that the function pointers are now strongly typed, and the table includes six new function pointers. To use this structure, event tracking libraries must also set the dwVersion member to 5 before calling IOCTL_CELOG_IMPORT.
Event tracking libraries built with older structures will continue to work on newer versions of the operating system, but new event tracking libraries should use CeLogImportTable_V5.
This structure is used in conjunction with IOCTL_CELOG_IMPORT, which is the I/O control used by the CeLog DLL to request information about the kernel.
Because an event tracking library loads into the kernel, the kernel often calls CeLogData from within parts of the kernel where it is not safe to make system calls. These restrictions mean that it is not safe to interact with the kernel debugger to perform activities such as setting a breakpoint, or stepping through the code in the debugger.
In addition, it is not safe to call the functions in this structure that are logged during restricted parts of the kernel. Failing to follow these restrictions might cause an unrecoverable system crash.
Syntax
typedef struct {
DWORD dwVersion;
PFN_CeLogImport_CreateEventW pCreateEventW;
PFN_CeLogImport_EventModify pEventModify;
PFN_CeLogImport_CreateFileMappingW pCreateFileMappingW;
PFN_CeLogImport_MapViewOfFile pMapViewOfFile;
PFN_CeLogImport_UnmapViewOfFile pUnmapViewOfFile;
PFN_CeLogImport_CloseHandle pCloseHandle;
PFN_CeLogImport_LockPages pLockPages;
PFN_CeLogImport_UnlockPages pUnlockPages;
PFN_CeLogImport_VirtualAlloc pVirtualAlloc;
PFN_CeLogImport_VirtualFree pVirtualFree;
PFN_CeLogImport_MapPtrToProcess pMapPtrToProcess;
PFN_CeLogImport_QueryPerformanceCounter pQueryPerformanceCounter;
PFN_CeLogImport_QueryPerformanceFrequency pQueryPerformanceFrequency;
PFN_CeLogImport_NKDbgPrintfW pNKDbgPrintfW;
PFN_CeLogImport_CeLogReSync pCeLogReSync;
PFN_CeLogImport_GetLastError pGetLastError;
PFN_CeLogImport_SetLastError pSetLastError;
PFN_CeLogImport_GetThreadCallStack pGetThreadCallStack;
PFN_CeLogImport_InSysCall pInSysCall;
DWORD* pdwCeLogTLBMiss;
DWORD dwCeLogLargeBuf;
DWORD dwCeLogSmallBuf;
DWORD dwDefaultThreadQuantum;
DWORD dwNumberOfCPUs;
PFN_CeLogImport_RegQueryValueExW pRegQueryValueExW;
PFN_CeLogImport_CeLogData pCeLogData;
PFN_CeLogImport_AcquireCeLogSpinLock pAcquireCeLogSpinLock;
PFN_CeLogImport_ReleaseCeLogSpinLock pReleaseCeLogSpinLock;
PFN_CeLogImport_GetCurrentCPU pGetCurrentCPU;
PFN_CeLogImport_VirtualAllocCopyInKernel pVirtualAllocCopyInKernel;
PFN_CeLogImport_QueryPerformanceCounterEx pQueryPerformanceCounterEx; // QPC with interrupt flag
} CeLogImportTable_V5;
Members
Parameter |
Description |
---|---|
dwVersion |
Specifies the version of this structure. Must be set to 5. |
pCreateEventW |
Pointer to the DLL version of the CreateEvent function. |
pEventModify |
Pointer to the DLL version of EventModify. EventModify is used to implement the SetEvent, the ResetEvent, and the PulseEvent functions. The equivalent calls for these are:
The pEventModify function that you pass as part of this function does nothing if you call it during a KCall. A CeLog DLL can test whether it is in a KCall by using the pInSysCall function that is part of this structure, too. |
pCreateFileMapping |
Pointer to the DLL version of the CreateFileMapping function. |
pMapViewOfFile |
Pointer to the DLL version of the MapViewOfFile function. This pointer will be NULL if the kernel does not include support for memory-mapped files. |
pUnmapViewOfFile |
Pointer to the DLL version of the UnmapViewOfFile function. |
pCloseHandle |
Pointer to the DLL version of the CloseHandle function. |
pLockPages |
Pointer to the DLL version of the LockPages function. |
pUnlockPagew |
Pointer to the DLL version of the UnlockPages function. |
pVirtualAlloc |
Pointer to the DLL version of the VirtualAlloc function. |
pVirtualFree |
Pointer to the DLL version of the VirtualFree function. |
pMapPtrToProcess |
NULL. |
pQueryPerformanceCounter |
Obsolete. This may not work on SMP; instead, use pQueryPerformanceCounterEx. Pointer to the DLL version of the QueryPerformanceCounter function. The caller must not own the CeLog spinlock while calling this function because that can cause deadlocks on an SMP machine. |
pQueryPerformanceFrequency |
Pointer to the DLL version of the QueryPerformanceFrequency function. |
pNKDbgPrintfW |
Pointer to the DLL version of the NKDbgPrintfW function. |
pCeLogReSync |
Pointer to the DLL's version of CeLogReSync. |
pGetLastError |
Pointer to the DLL's version of GetLastError. |
pSetLastError |
Pointer to the DLL's version of SetLastError. |
pGetThreadCallStack |
Pointer to the DLL's version of GetThreadCallStack. |
pInSysCall |
Pointer to the DLL version of the InSysCall wrapper function. For information about important restrictions for this function, see the Remarks section. |
pdwCeLogTLBMiss |
Pointer to the translation look-aside buffer (TLB) miss count. The kernel software TLB miss handler maintains this pointer. |
dwCeLogLargeBuf |
OEM-changeable large buffer size. |
dwCeLogSmallBuf |
Deprecated. The value is always 0. |
dwDefaultThreadQuantum |
Specifies the scheduler's default thread quantum. |
dwNumberOfCPUs |
Specifies the number of CPUs on the target device. |
pRegQueryValueExW |
Pointer to the kernel entry point to the NKRegQueryValueExW function. |
pCeLogData |
Pointer to the kernel entry point to the CeLogData function. |
pAcquireCeLogSpinLock |
Acquires the CeLog spinlock. |
pReleaseCeLogSpinLock |
Releases the CeLog spinlock. |
pGetCurrentCPU |
Gets the processor ID. The caller must own the CeLog spinlock. |
pVirtualAllocCopyInKernel |
The VirtualAllocCopyEx function with the src and dest parameters set to kernel. |
pQueryPerformanceCounterEx |
A different version of pQueryPerformanceCounter, one with an interrupt flag. The caller must not own the CeLog spinlock while calling this function because that can cause deadlocks on an SMP machine. |
Remarks
The pCeLogData member is a pointer to the CeLogData. Logging libraries can call this function to recursively log data to all CeLog logging libraries.
The pAcquireCeLogSpinLock and the pReleaseCeLogSpinLock members can be used to acquire a spinlock for synchronization inside the CeLogData logging method.
The pGetCurrentCPU member returns the current processor, and can only be called while holding the CeLog spinlock.
The pVirtualAllocCopyInKernel member is a pointer to a version of the VirtualAllocCopyEx function that expects that the source and destination process are the kernel. Event tracking libraries can use this function to allocate uncached copies of virtual addresses.
The pQueryPerformanceCounter and the pQueryPerformanceCounterEx members fail if called while holding any spinlocks, including the CeLogData spinlock.
It is recommended that you use pQueryPerformanceCounterEx, instead of pQueryPerformanceCounter, because on SMP machines, the latter function always fails to return the performance counter. These functions are the same, except in one respect. You must pass an additional flag to pQueryPerformanceCounterEx indicating whether you are calling it during an interrupt. Pass TRUE to pQueryPerformanceCounterEx if you call it during an interrupt; otherwise, pass FALSE. Also, on SMP machines, passing FALSE during an interrupt might cause the system to stop responding.
The pEventModify member fails if it is not currently safe to set the event.
Function Pointer Types
typedef HANDLE (*PFN_CeLogImport_CreateEventW) (LPSECURITY_ATTRIBUTES lpsa, BOOL bManualReset,BOOL bInitialState, LPCWSTR lpName);
typedef BOOL (*PFN_CeLogImport_EventModify) (HANDLE hEvent, DWORD func);
typedef HANDLE (*PFN_CeLogImport_CreateFileMappingW) (HANDLE hFile, LPSECURITY_ATTRIBUTES lpsa, DWORD flProtect, DWORD dwMaxSizeHigh, DWORD dwMaxSizeLow, LPCWSTR lpName);
typedef LPVOID (*PFN_CeLogImport_MapViewOfFile) (HANDLE hMap, DWORD fdwAccess, DWORD dwOffsetHigh, DWORD dwOffsetLow, DWORD cbMap);
typedef BOOL (*PFN_CeLogImport_UnmapViewOfFile) (LPCVOID lpvAddr);
typedef BOOL (*PFN_CeLogImport_CloseHandle) (HANDLE hObject);
typedef BOOL (*PFN_CeLogImport_LockPages) (LPVOID lpvAddress, DWORD cbSize, PDWORD pPFNs, int fOptions);
typedef BOOL (*PFN_CeLogImport_UnlockPages) (LPVOID lpvAddress, DWORD cbSize);
typedef LPVOID (*PFN_CeLogImport_VirtualAlloc) (LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect);
typedef BOOL (*PFN_CeLogImport_VirtualFree) (LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType);
typedef LPVOID (*PFN_CeLogImport_MapPtrToProcess) (LPVOID lpv, HANDLE hProc);
typedef BOOL (*PFN_CeLogImport_QueryPerformanceCounter) (LARGE_INTEGER *lpPerformanceCount);
typedef BOOL (*PFN_CeLogImport_QueryPerformanceFrequency) (LARGE_INTEGER *lpFrequency);
typedef void (*PFN_CeLogImport_NKDbgPrintfW) (LPCWSTR lpszFmt, ...);
typedef BOOL (*PFN_CeLogImport_CeLogReSync) ();
typedef DWORD (*PFN_CeLogImport_GetLastError) ();
typedef VOID (*PFN_CeLogImport_SetLastError) (DWORD dwError);
typedef ULONG (*PFN_CeLogImport_GetThreadCallStack) (HANDLE hThrd, ULONG dwMaxFrames, LPVOID lpFrames, DWORD dwFlags, DWORD dwSkip);
typedef BOOL (*PFN_CeLogImport_InSysCall) ();
typedef LONG (*PFN_CeLogImport_RegQueryValueExW) (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD);
typedef void (*PFN_CeLogImport_CeLogData) (BOOL, DWORD, PVOID, DWORD, DWORD, DWORD, DWORD, BOOL);
typedef void (*PFN_CeLogImport_AcquireCeLogSpinLock) (void);
typedef void (*PFN_CeLogImport_ReleaseCeLogSpinLock) (void);
typedef DWORD (*PFN_CeLogImport_GetCurrentCPU) (void);
typedef LPVOID (*PFN_CeLogImport_VirtualAllocCopyInKernel) (LPVOID pAddr, DWORD cbSize, DWORD dwProtect);
typedef BOOL (*PFN_CeLogImport_QueryPerformanceCounterEx) (LARGE_INTEGER *lpPerformanceCount, BOOL fDuringInterrupt);
See Also
Reference
CeLog Event Tracking Structures
LockPages
UnlockPages
VirtualAlloc
VirtualFree
QueryPerformanceCounter
QueryPerformanceFrequency
CeLogReSync
GetLastError
SetLastError
GetThreadCallStack
Other Resources
OAL Structures
IOCTL_CELOG_IMPORT
CreateFileMapping
MapViewOfFile
UnmapViewOfFile
CloseHandle