|
|
//+-------------------------------------------------------------------------
//
// Copyright (C) 1992, Microsoft Corporation.
//
// File: LibSup.c
//
// Contents:
//
// Functions:
//
// History:
//
// Notes:
//
//--------------------------------------------------------------------------
#include "nt.h"
#include "ntrtl.h"
#include "nturtl.h"
#include "libsup.h"
#include "ntddnfs.h"
#include "dfsfsctl.h"
#include "malloc.h"
UNICODE_STRING LocalDfsName = { sizeof(DFS_SERVER_NAME)-sizeof(UNICODE_NULL), sizeof(DFS_SERVER_NAME)-sizeof(UNICODE_NULL), DFS_SERVER_NAME };
//+-------------------------------------------------------------------------
//
// Function: DfsOpen, public
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
//--------------------------------------------------------------------------
static FILE_FULL_EA_INFORMATION PrincipalEAHeader = { 0, 0, (sizeof EA_NAME_PRINCIPAL-1), 0, "" };
NTSTATUS DfsOpen( IN OUT PHANDLE DfsHandle, IN PUNICODE_STRING DfsName OPTIONAL ) { NTSTATUS status; OBJECT_ATTRIBUTES objectAttributes; IO_STATUS_BLOCK ioStatus; PUNICODE_STRING name;
if (ARGUMENT_PRESENT(DfsName)) { name = DfsName; } else { name = &LocalDfsName; }
InitializeObjectAttributes( &objectAttributes, name, OBJ_CASE_INSENSITIVE, NULL, NULL );
status = NtCreateFile( DfsHandle, SYNCHRONIZE | FILE_WRITE_DATA, &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: DfsFsctlEx, local
//
// Synopsis: Issues an NtFsControlFile call to the Dsfs file system
// driver.
//
// Arguments: [DfsFile] -- Target of fsctl
// [FsControlCode] -- The file system control code to be used
// [InputBuffer] -- The fsctl input buffer
// [InputBufferLength]
// [OutputBuffer] -- The fsctl output buffer
// [OutputBufferLength]
// [pInformation] -- Information field of returned IoStatus.
//
// Returns: NTSTATUS - the status of the open or fsctl operation.
//
//--------------------------------------------------------------------------
NTSTATUS DfsFsctlEx( IN HANDLE DfsFile, IN ULONG FsControlCode, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID OutputBuffer OPTIONAL, IN ULONG OutputBufferLength, OUT PULONG pInformation ) { NTSTATUS Stat; IO_STATUS_BLOCK IoStatus;
Stat = NtFsControlFile( DfsFile, NULL, // Event,
NULL, // ApcRoutine,
NULL, // ApcContext,
&IoStatus, FsControlCode, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength );
if ( NT_SUCCESS(Stat) ) { Stat = IoStatus.Status; *pInformation = (ULONG)IoStatus.Information; }
return Stat; }
//+-------------------------------------------------------------------------
//
// Function: DfsFsctl, public
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
//--------------------------------------------------------------------------
NTSTATUS DfsFsctl( IN HANDLE DfsHandle, IN ULONG FsControlCode, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID OutputBuffer OPTIONAL, IN ULONG 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;
return status; }
|