windows-nt/Source/XPSP1/NT/base/fs/dfs/ui/dfsutil/flush.cxx
2020-09-26 16:20:57 +08:00

192 lines
4.8 KiB
C++

//--------------------------------------------------------------------------
//
// Copyright (C) 1999, Microsoft Corporation
//
// File: flush.cxx
//
//--------------------------------------------------------------------------
#define UNICODE 1
#include <stdio.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <shellapi.h>
#include <winldap.h>
#include <stdlib.h>
#include <dsgetdc.h>
#include <lm.h>
#include <dfsstr.h>
#include <dfsmrshl.h>
#include <marshal.hxx>
#include <lmdfs.h>
#include <dfspriv.h>
#include <dfsm.hxx>
#include <recon.hxx>
#include <rpc.h>
#include "struct.hxx"
#include "ftsup.hxx"
#include "stdsup.hxx"
#include "rootsup.hxx"
WCHAR wszEverything[] = L"*";
DWORD
PktFlush(
LPWSTR EntryPath)
{
DWORD dwErr = STATUS_SUCCESS;
NTSTATUS NtStatus;
HANDLE DriverHandle = NULL;
IO_STATUS_BLOCK IoStatusBlock;
OBJECT_ATTRIBUTES objectAttributes;
UNICODE_STRING DfsDriverName;
ULONG Type = 0;
if (fSwDebug)
MyPrintf(L"PktFlush(%ws)\r\n", EntryPath);
if (EntryPath == NULL)
EntryPath = wszEverything;
MyPrintf(L"EntryPath=[%ws]\r\n", EntryPath);
RtlInitUnicodeString(&DfsDriverName, DFS_DRIVER_NAME);
InitializeObjectAttributes(
&objectAttributes,
&DfsDriverName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
NtStatus = NtCreateFile(
&DriverHandle,
SYNCHRONIZE | FILE_WRITE_DATA,
&objectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_OPEN_IF,
FILE_CREATE_TREE_CONNECTION | FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
if (!NT_SUCCESS(NtStatus)) {
dwErr = RtlNtStatusToDosError(NtStatus);
if (fSwDebug)
MyPrintf(L"NtCreateFile returned 0x%x\r\n", NtStatus);
goto Cleanup;
}
NtStatus = NtFsControlFile(
DriverHandle,
NULL, // Event,
NULL, // ApcRoutine,
NULL, // ApcContext,
&IoStatusBlock,
FSCTL_DFS_PKT_FLUSH_CACHE,
EntryPath,
wcslen(EntryPath) * sizeof(WCHAR),
NULL,
0);
NtClose(DriverHandle);
if (!NT_SUCCESS(NtStatus)) {
if (fSwDebug)
MyPrintf(L"NtFsControlFile returned 0x%x\r\n", NtStatus);
}
dwErr = RtlNtStatusToDosError(NtStatus);
Cleanup:
if (fSwDebug && dwErr != ERROR_SUCCESS)
MyPrintf(L"PktFlush exit %d\r\n", dwErr);
return(dwErr);
}
DWORD
SpcFlush(
LPWSTR EntryPath)
{
DWORD dwErr = STATUS_SUCCESS;
NTSTATUS NtStatus;
HANDLE DriverHandle = NULL;
IO_STATUS_BLOCK IoStatusBlock;
OBJECT_ATTRIBUTES objectAttributes;
UNICODE_STRING DfsDriverName;
ULONG Type = 0;
if (fSwDebug)
MyPrintf(L"SpcFlush(%ws)\r\n", EntryPath);
if (EntryPath == NULL)
EntryPath = wszEverything;
RtlInitUnicodeString(&DfsDriverName, DFS_DRIVER_NAME);
InitializeObjectAttributes(
&objectAttributes,
&DfsDriverName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
NtStatus = NtCreateFile(
&DriverHandle,
SYNCHRONIZE | FILE_WRITE_DATA,
&objectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_OPEN_IF,
FILE_CREATE_TREE_CONNECTION | FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
if (!NT_SUCCESS(NtStatus)) {
dwErr = RtlNtStatusToDosError(NtStatus);
if (fSwDebug)
MyPrintf(L"NtCreateFile returned 0x%x\r\n", NtStatus);
goto Cleanup;
}
MyPrintf(L"EntryPath=[%ws]\r\n", EntryPath);
NtStatus = NtFsControlFile(
DriverHandle,
NULL, // Event,
NULL, // ApcRoutine,
NULL, // ApcContext,
&IoStatusBlock,
FSCTL_DFS_PKT_FLUSH_SPC_CACHE,
EntryPath,
wcslen(EntryPath) * sizeof(WCHAR),
NULL,
0);
NtClose(DriverHandle);
if (!NT_SUCCESS(NtStatus)) {
if (fSwDebug)
MyPrintf(L"NtFsControlFile returned 0x%x\r\n", NtStatus);
}
dwErr = RtlNtStatusToDosError(NtStatus);
Cleanup:
if (fSwDebug && dwErr != ERROR_SUCCESS)
MyPrintf(L"PktFlush exit %d\r\n", dwErr);
return(dwErr);
}