windows-nt/Source/XPSP1/NT/com/ole32/dcomss/olescm/dfsext.cxx
2020-09-26 16:20:57 +08:00

140 lines
3.5 KiB
C++

//+----------------------------------------------------------------------------
//
// Copyright (C) 1996, Microsoft Corporation
//
// File: dfsext.cxx
//
// Contents: Code to see if a path refers to a Dfs path.
//
// Classes: None
//
// Functions: TranslateDfsPath
//
// History: June 17, 1996 Milans Created
//
//-----------------------------------------------------------------------------
#include "act.hxx"
#ifdef DFSACTIVATION
NTSTATUS
DfsFsctl(
IN HANDLE DfsHandle,
IN ULONG FsControlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN OUT PULONG OutputBufferLength);
NTSTATUS
DfsOpen(
IN OUT PHANDLE DfsHandle);
//+-------------------------------------------------------------------------
//
// Function: DfsOpen, private
//
// Synopsis: Opens a handle to the Dfs driver for fsctl purposes.
//
// Arguments: [DfsHandle] -- On successful return, contains handle to the
// driver.
//
// Returns: NTSTATUS of attempt to open the Dfs driver.
//
//--------------------------------------------------------------------------
NTSTATUS
DfsOpen(
IN OUT PHANDLE DfsHandle)
{
NTSTATUS status;
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK ioStatus;
UNICODE_STRING name = {
sizeof(DFS_DRIVER_NAME)-sizeof(UNICODE_NULL),
sizeof(DFS_DRIVER_NAME)-sizeof(UNICODE_NULL),
DFS_DRIVER_NAME};
InitializeObjectAttributes(
&objectAttributes,
&name,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
status = NtCreateFile(
DfsHandle,
SYNCHRONIZE,
&objectAttributes,
&ioStatus,
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(status))
status = ioStatus.Status;
return status;
}
//+-------------------------------------------------------------------------
//
// Function: DfsFsctl, public
//
// Synopsis: Fsctl's to the Dfs driver.
//
// Arguments: [DfsHandle] -- Handle to the Dfs driver, usually obtained by
// calling DfsOpen.
// [FsControlCode] -- The FSCTL code (see private\inc\dfsfsctl.h)
// [InputBuffer] -- InputBuffer to the fsctl.
// [InputBufferLength] -- Length, in BYTES, of InputBuffer
// [OutputBuffer] -- OutputBuffer to the fsctl.
// [OutputBufferLength] -- Length, in BYTES, of OutputBuffer
//
// Returns: NTSTATUS of Fsctl attempt.
//
//--------------------------------------------------------------------------
NTSTATUS
DfsFsctl(
IN HANDLE DfsHandle,
IN ULONG FsControlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN OUT PULONG OutputBufferLength
)
{
NTSTATUS status;
IO_STATUS_BLOCK ioStatus;
status = NtFsControlFile(
DfsHandle,
NULL, // Event,
NULL, // ApcRoutine,
NULL, // ApcContext,
&ioStatus,
FsControlCode,
InputBuffer,
InputBufferLength,
OutputBuffer,
*OutputBufferLength
);
if(NT_SUCCESS(status))
status = ioStatus.Status;
if (status == STATUS_BUFFER_OVERFLOW)
*OutputBufferLength = *((PULONG) OutputBuffer);
return status;
}
#endif // DFSACTIVATION