193 lines
4.3 KiB
C
193 lines
4.3 KiB
C
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|
|
|
|
|