192 lines
4.8 KiB
C++
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);
|
||
|
}
|