windows-nt/Source/XPSP1/NT/sdktools/debuggers/snapshot/test/testsnap.c
2020-09-26 16:20:57 +08:00

88 lines
2.5 KiB
C

#define UNICODE
#define _UNICODE
#include <stdlib.h>
#include <stdio.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#define MAX_SNAPSHOT_SIZE 2048
typedef BOOL (*SNAPSHOTFUNC)(DWORD Flags, LPCTSTR *lpStrings, PLONG MaxBuffSize, LPTSTR SnapShotBuff);
_cdecl main()
{
HANDLE hEventLog;
PSID pUserSid = NULL;
PTOKEN_USER pTokenUser = NULL;
DWORD dwSidSize = sizeof(SID), dwEventID;
WCHAR szProcessName[MAX_PATH + 1], szReason[128];
WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
LPWSTR lpStrings[7];
WORD wEventType, wStringCnt;
WCHAR szShutdownType[32], szMinorReason[32];
BOOL bRet = FALSE;
HMODULE hSnapShot;
SNAPSHOTFUNC pSnapShotProc;
struct {
DWORD Reason ;
WCHAR SnapShotBuf[MAX_SNAPSHOT_SIZE];
} SnapShot ;
LONG SnapShotSize = MAX_SNAPSHOT_SIZE ;
WCHAR wszDll[MAX_PATH];
INT sTicks, eTicks;
wStringCnt = 6;
lpStrings[0] = L"TestProcess";
lpStrings[1] = L"TestComputer";
lpStrings[2] = L"4";
lpStrings[3] = L"2";
lpStrings[4] = L"Reboot";
lpStrings[5] = L"This is a test comment";
//take a snapshot if shutdown is unplanned.
//GetWindowsDirectoryW(wszDll, sizeof(wszDll) / sizeof(WCHAR));
//wcsncat(wszDll, L"\\system32\\snapshot.dll",MAX_PATH - wcslen(wszDll));
wsprintf(wszDll,L"snapshot.dll");
hSnapShot = LoadLibrary(wszDll);
if (! hSnapShot) {
printf("Load %S failed!\n",wszDll);
} else {
pSnapShotProc = (SNAPSHOTFUNC)GetProcAddress(hSnapShot, "LogSystemSnapshot");
if (!pSnapShotProc) {
printf("GetProcAddress for LogSystemSnapshot on snapshot.dll failed!\n");
} else {
SnapShotSize = MAX_SNAPSHOT_SIZE ;
__try { // Assume the worst about the snapshot DLL!
printf("Calling the snapshot DLL\n");
sTicks = GetTickCount();
(*pSnapShotProc)(0,lpStrings,&SnapShotSize,&SnapShot.SnapShotBuf[0]);
eTicks = GetTickCount();
} __except(EXCEPTION_EXECUTE_HANDLER) {
printf("Exception Occurred!\n");
wsprintf(SnapShot.SnapShotBuf, L"State Snapshot took an exception\n");
eTicks = sTicks = 0 ;
}
SnapShotSize = wcslen(SnapShot.SnapShotBuf) ;
}
FreeLibrary(hSnapShot);
if (SnapShotSize > 0) {
printf("Snapshot buffer is %d bytes\n%S\n",SnapShotSize,SnapShot.SnapShotBuf);
printf("Time Taken %dms\n",eTicks-sTicks);
}
}
}