|
|
/*++
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
control.c
Abstract:
User-mode interface to SR.SYS.
Author:
Keith Moore (keithmo) 15-Dec-1998 Paul McDaniel (paulmcd) 07-Mar-2000 (sr)
Revision History:
--*/
#include "precomp.h"
//
// Private macros.
//
//
// Private prototypes.
//
//
// Public functions.
//
/***************************************************************************++
Routine Description:
Opens a control channel to SR.SYS.
Arguments:
Options - Supplies zero or more SR_OPTION_* flags. pControlHandle - Receives a handle to the control channel if successful.
Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI SrCreateControlHandle( IN ULONG Options, OUT PHANDLE pControlHandle ) { NTSTATUS status;
//
// First, just try to open the driver.
//
status = SrpOpenDriverHelper( pControlHandle, // pHandle
GENERIC_READ | // DesiredAccess
GENERIC_WRITE | SYNCHRONIZE, Options, // Options
FILE_OPEN, // CreateDisposition
NULL // pSecurityAttributes
);
//
// If we couldn't open the driver because it's not running, then try
// to start the driver & retry the open.
//
if (status == STATUS_OBJECT_NAME_NOT_FOUND || status == STATUS_OBJECT_PATH_NOT_FOUND) { if (SrpTryToStartDriver()) { status = SrpOpenDriverHelper( pControlHandle, // pHandle
GENERIC_READ | // DesiredAccess
GENERIC_WRITE | SYNCHRONIZE, Options, // Options
FILE_OPEN, // CreateDisposition
NULL // pSecurityAttributes
); } }
return SrpNtStatusToWin32Status( status );
} // SrCreateControlHandle
/***************************************************************************++
Routine Description:
SrCreateRestorePoint is called by the controlling application to declare a new restore point. The driver will create a local restore directory and then return a unique sequence number to the controlling app.
Arguments:
ControlHandle - the control HANDLE.
pNewSequenceNumber - holds the new sequnce number on return. Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI SrCreateRestorePoint( IN HANDLE ControlHandle, OUT PULONG pNewRestoreNumber ) { NTSTATUS Status; //
// Make the request.
//
Status = SrpSynchronousDeviceControl( ControlHandle, // FileHandle
IOCTL_SR_CREATE_RESTORE_POINT, // IoControlCode
NULL, // pInputBuffer
0, // InputBufferLength
pNewRestoreNumber, // pOutputBuffer
sizeof(ULONG), // OutputBufferLength
NULL ); // pBytesTransferred
return SrpNtStatusToWin32Status( Status );
} // SrCreateRestorePoint
/***************************************************************************++
Routine Description:
SrGetNextSequenceNum is called by the application to get the next available sequence number from the driver.
Arguments:
ControlHandle - the control HANDLE.
pNewSequenceNumber - holds the new sequnce number on return. Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI SrGetNextSequenceNum( IN HANDLE ControlHandle, OUT PINT64 pNextSequenceNum ) { NTSTATUS Status; //
// Make the request.
//
Status = SrpSynchronousDeviceControl( ControlHandle, // FileHandle
IOCTL_SR_GET_NEXT_SEQUENCE_NUM, NULL, // pInputBuffer
0, // InputBufferLength
pNextSequenceNum, // pOutputBuffer
sizeof(INT64), // OutputBufferLength
NULL ); // pBytesTransferred
return SrpNtStatusToWin32Status( Status );
} // SrCreateRestorePoint
/***************************************************************************++
Routine Description:
SrReloadConfiguration causes the driver to reload it's configuration from it's configuration file that resides in a preassigned location. A controlling service can update this file, then alert the driver to reload it.
Arguments:
ControlHandle - the control HANDLE. Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI SrReloadConfiguration( IN HANDLE ControlHandle ) { NTSTATUS Status; //
// Make the request.
//
Status = SrpSynchronousDeviceControl( ControlHandle, // FileHandle
IOCTL_SR_RELOAD_CONFIG, // IoControlCode
NULL, // pInputBuffer
0, // InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL ); // pBytesTransferred
return SrpNtStatusToWin32Status( Status );
} // SrReloadConfiguration
/***************************************************************************++
Routine Description:
SrStopMonitoring will cause the driver to stop monitoring file changes. The default state of the driver on startup is to monitor file changes.
Arguments:
ControlHandle - the control HANDLE. Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI SrStopMonitoring( IN HANDLE ControlHandle ) { NTSTATUS Status; //
// Make the request.
//
Status = SrpSynchronousDeviceControl( ControlHandle, // FileHandle
IOCTL_SR_STOP_MONITORING, // IoControlCode
NULL, // pInputBuffer
0, // InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL ); // pBytesTransferred
return SrpNtStatusToWin32Status( Status );
} // SrStopMonitoring
/***************************************************************************++
Routine Description:
SrStartMonitoring will cause the driver to start monitoring file changes. The default state of the driver on startup is to monitor file changes. This api is only needed in the case that the controlling application has called SrStopMonitoring and wishes to restart it.
Arguments:
ControlHandle - the control HANDLE. Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI SrStartMonitoring( IN HANDLE ControlHandle ) { NTSTATUS Status; //
// Make the request.
//
Status = SrpSynchronousDeviceControl( ControlHandle, // FileHandle
IOCTL_SR_START_MONITORING, // IoControlCode
NULL, // pInputBuffer
0, // InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL ); // pBytesTransferred
return SrpNtStatusToWin32Status( Status );
} // SrStartMonitoring
/***************************************************************************++
Routine Description:
SrDisableVolume is used to temporarily disable monitoring on the specified volume. this is reset by a call to SrReloadConfiguration. There is no EnableVolume.
Arguments:
ControlHandle - the HANDLE from SrCreateControlHandle.
pVolumeName - the name of the volume to disable, in the nt format of \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume3.
Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI SrDisableVolume( IN HANDLE ControlHandle, IN PWSTR pVolumeName ) { NTSTATUS Status;
//
// Make the request.
//
Status = SrpSynchronousDeviceControl( ControlHandle, // FileHandle
IOCTL_SR_DISABLE_VOLUME, // IoControlCode
pVolumeName,// pInputBuffer
(lstrlenW(pVolumeName)+1)*sizeof(WCHAR),// InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL ); // pBytesTransferred
return SrpNtStatusToWin32Status( Status ); } // SrDisableVolume
/***************************************************************************++
Routine Description:
SrSwitchAllLogs is used to cause the filter to close all of the open log files on all volumes, and use new log files. this is used so that another process can parse these files without worrying about the filter writing to them. use this to get a consistent view of the restore point.
Arguments:
ControlHandle - the HANDLE from SrCreateControlHandle.
Return Value:
ULONG - Completion status.
--***************************************************************************/ ULONG WINAPI SrSwitchAllLogs( IN HANDLE ControlHandle ) { NTSTATUS Status;
//
// Make the request.
//
Status = SrpSynchronousDeviceControl( ControlHandle, // FileHandle
IOCTL_SR_SWITCH_LOG, // IoControlCode
NULL, // pInputBuffer
0, // InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL ); // pBytesTransferred
return SrpNtStatusToWin32Status( Status ); } // SrSwitchAllLogs
//
// Private functions.
//
|