/*++ Copyright (c) 1998-1999 Microsoft Corporation Module Name: main.c Abstract: simple bvt-like test code for SR.SYS. Author: Paul McDaniel (paulmcd) 07-Mar-2000 Revision History: --*/ #include "precomp.h" #define NtStatusToWin32Status( Status ) \ ( ( (Status) == STATUS_SUCCESS ) \ ? NO_ERROR \ : RtlNtStatusToDosError( Status ) ) ULONG Shutdown = 0; HANDLE ControlHandle = NULL; DWORD WINAPI NotifyThread( LPVOID pParameter ) { union { SR_NOTIFICATION_RECORD Record; UCHAR Buffer[1024*4]; } NotifyRecord; ULONG Error; ULONG Length; OVERLAPPED Overlapped; ZeroMemory(&Overlapped, sizeof(Overlapped)); Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); while (Shutdown == 0) { ResetEvent(Overlapped.hEvent); if (ControlHandle == NULL) { Sleep(100); continue; } Error = SrWaitForNotification( ControlHandle, (PVOID)&NotifyRecord, sizeof(NotifyRecord), &Overlapped ); if (Error == ERROR_IO_PENDING) { if (GetOverlappedResult(ControlHandle, &Overlapped, &Length, TRUE)) { Error = 0; } else { Error = GetLastError(); } } if (Error != 0) { printf("\n!SrWaitForNotification failed %d\n", Error); } else { printf( "\n-SrWaitForNotification(%ls, %d)\n", NotifyRecord.Record.VolumeName.Buffer, NotifyRecord.Record.NotificationType ); } } CloseHandle(Overlapped.hEvent); Shutdown = 2; return 0; } int __cdecl main(int argc, char ** argv) { ULONG Error = 0; UCHAR Char; ULONG Number; HANDLE ThreadHandle; // // Start the monitor process // printf("started...\n" ); Error = SrCreateControlHandle(SR_OPTION_OVERLAPPED, &ControlHandle); if (Error != 0) { printf("!SrCreateControlHandle failed %d\n", Error); return Error; } ThreadHandle = CreateThread(NULL, 0, NotifyThread, NULL, 0, NULL); CloseHandle(ThreadHandle); while (Shutdown == 0) { printf("0=open,1=start,2=stop,3=new_restore_point,4=close,5=quit,6=reload,7=disable: "); Char = (UCHAR)_getche(); printf("\n"); switch (Char) { case '0': if (ControlHandle != NULL) { printf("already open!\n"); break; } Error = SrCreateControlHandle(SR_OPTION_OVERLAPPED, &ControlHandle); if (Error != 0) { printf("!SrCreateControlHandle failed %d\n", Error); return Error; } break; case '1': Error = SrStartMonitoring(ControlHandle); if (Error != 0) { printf("!SrStartMonitoring failed %d\n", Error); } else { printf("-SrStartMonitoring \n"); } break; case '2': Error = SrStopMonitoring(ControlHandle); if (Error != 0) { printf("!SrStopMonitoring failed %d\n", Error); } else { printf("-SrStopMonitoring \n"); } break; case '3': Error = SrCreateRestorePoint(ControlHandle, &Number); if (Error != 0) { printf("!SrCreateRestorePoint failed %d\n", Error); } else { printf("-SrCreateRestorePoint(%d)\n", Number); } break; case '4': if (ControlHandle == NULL) { printf ("already closed!\n"); break; } CloseHandle(ControlHandle); ControlHandle = NULL; break; case '5': printf("quit...\n"); Shutdown = 1; break; case '6': Error = SrReloadConfiguration(ControlHandle); if (Error != 0) { printf("!SrReloadConfiguration failed %d\n", Error); } else { printf("-SrReloadConfiguration\n"); } break; case '7': Error = SrDisableVolume(ControlHandle, L"\\??\\D:"); if (Error != 0) { printf("!SrDisableVolume failed %d\n", Error); } else { printf("-SrDisableVolume\n"); } break; }; } CloseHandle(ControlHandle); // // wait for our thread to die // while (Shutdown < 2) Sleep(0); return 0; }