120 lines
2.9 KiB
C
120 lines
2.9 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1997-1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
ntutils.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains various tools from NT land. Made a separate
|
||
|
file because of the use of various nt headers.
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include <ntreppch.h>
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include <frs.h>
|
||
|
|
||
|
#include <ntdddisk.h>
|
||
|
|
||
|
BOOL
|
||
|
FrsIsDiskWriteCacheEnabled(
|
||
|
IN PWCHAR Path
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Description:
|
||
|
|
||
|
Determines if the disk has enabled write caching.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Path - Fully qualified path of a file or directory
|
||
|
|
||
|
Return value:
|
||
|
|
||
|
TRUE if write cache is enabled, FALSE otherwise.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
#undef DEBSUB
|
||
|
#define DEBSUB "FrsIsDiskWriteCacheEnabled:"
|
||
|
DWORD WStatus;
|
||
|
ULONG bytesTransferred;
|
||
|
PWCHAR Volume = NULL;
|
||
|
HANDLE driveHandle = INVALID_HANDLE_VALUE;
|
||
|
|
||
|
DISK_CACHE_INFORMATION cacheInfo;
|
||
|
cacheInfo.WriteCacheEnabled = FALSE;
|
||
|
|
||
|
try {
|
||
|
//
|
||
|
// Extract the volume from Path
|
||
|
//
|
||
|
Volume = FrsWcsVolume(Path);
|
||
|
if (!Volume) {
|
||
|
goto CLEANUP;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Open handle to the PhysicalDrive
|
||
|
//
|
||
|
DPRINT1(4, ":S: Checking the write cache state on %ws\n", Volume);
|
||
|
driveHandle = CreateFile(Volume,
|
||
|
GENERIC_READ | GENERIC_WRITE,
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
|
NULL,
|
||
|
OPEN_EXISTING,
|
||
|
0,
|
||
|
NULL);
|
||
|
|
||
|
if (!HANDLE_IS_VALID(driveHandle)) {
|
||
|
WStatus = GetLastError();
|
||
|
DPRINT1_WS(4, ":S: WARN - Could not open drive %ws;", Volume, WStatus);
|
||
|
goto CLEANUP;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Get cache info - IOCTL_DISK_GET_CACHE_INFORMATION
|
||
|
//
|
||
|
if (!DeviceIoControl(driveHandle,
|
||
|
IOCTL_DISK_GET_CACHE_INFORMATION,
|
||
|
NULL,
|
||
|
0,
|
||
|
&cacheInfo,
|
||
|
sizeof(DISK_CACHE_INFORMATION),
|
||
|
&bytesTransferred,
|
||
|
NULL)) {
|
||
|
WStatus = GetLastError();
|
||
|
DPRINT1_WS(4, ":S: WARN - DeviceIoControl(%ws);", Volume, WStatus);
|
||
|
goto CLEANUP;
|
||
|
}
|
||
|
|
||
|
DPRINT2(4, ":S: NEW IOCTL: Write cache on %ws is %s\n",
|
||
|
Volume, (cacheInfo.WriteCacheEnabled) ? "Enabled (WARNING)" : "Disabled");
|
||
|
|
||
|
CLEANUP:;
|
||
|
} except (EXCEPTION_EXECUTE_HANDLER) {
|
||
|
GET_EXCEPTION_CODE(WStatus);
|
||
|
DPRINT_WS(0, "ERROR - Exception.", WStatus);
|
||
|
}
|
||
|
//
|
||
|
// Cleanup handles, memory, ...
|
||
|
//
|
||
|
try {
|
||
|
FRS_CLOSE(driveHandle );
|
||
|
FrsFree(Volume);
|
||
|
} except (EXCEPTION_EXECUTE_HANDLER) {
|
||
|
GET_EXCEPTION_CODE(WStatus);
|
||
|
DPRINT_WS(0, "ERROR - Cleanup Exception.", WStatus);
|
||
|
}
|
||
|
|
||
|
return cacheInfo.WriteCacheEnabled;
|
||
|
|
||
|
} // IsDiskWriteCacheEnabled
|