//+---------------------------------------------------------------------------- // // 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