windows-nt/Source/XPSP1/NT/ds/netapi/svcimgs/ntrepl/util/ntutils.c
2020-09-26 16:20:57 +08:00

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