CreateFileDirect Method

Creates or opens a file or directory by passing the request directly to the filesystem.

Syntax

int64 CreateFileDirect(const char* lpszFileName, int bSynchronize, int iDesiredAccess, int iCreationDisposition, int iFlagsAndAttributes, int bCloseImmediately);
LONG64 CreateFileDirect(LPCWSTR lpszFileName, BOOL bSynchronize, INT iDesiredAccess, INT iCreationDisposition, INT iFlagsAndAttributes, BOOL bCloseImmediately);

Remarks

This method should be used instead of the Windows API's CreateFile function to create or open a file or directory when an application needs to access it without sending requests through the filesystem filter driver stack. If the file or directory is created or opened successfully, this method returns a file handle for it; otherwise, it returns INVALID_HANDLE_VALUE. The returned handle, if valid, must be closed using the Windows API's CloseHandle function when the application is finished with it.

If CloseImmediately is true, this method will create or open the specified file or directory and then immediately close the resulting handle. In this case, the handle will still be returned to indicate success of the operation, but it will not be usable in any file operations.

Since all requests against the returned file handle are routed directly to the filesystem (bypassing all filter drivers, including the class's), applications can use it to call Windows File API functions (ReadFile, WriteFile, etc.) within filesystem-related events without causing a system deadlock. (However, pay special attention to the Synchronize parameter's documentation, below.)

The returned handle can be used with some of the Windows API functions that accept a file handle as a parameter. Support may vary depending on the internal implementation of each function. The following Windows API functions have been tested and proven to work:

Other functions may work as well but have not been tested.

When calling the GetFileInformationByHandleEx function, note that only the following information classes are currently supported:

  • FileAttributeTagInfo
  • FileBasicInfo
  • FileStandardInfo
  • FileStreamInfo
  • FileIdInfo
Support for other information classes depends on the class and OS capabilities.

The FileName, DesiredAccess, CreationDisposition, and FlagsAndAttributes parameters correspond to the lpFileName, dwDesiredAccess, dwCreationDisposition, and dwFlagsAndAttributes parameters of the Windows API's CreateFile function (respectively). Please refer to Microsoft's documentation for more information on how to set these parameters appropriately.

The file is opened with a sharing mode that allows other processes open the file for any kind of operation.

The Synchronize parameter specifies whether this method should be synchronized with the external thread that originated the underlying filesystem request associated with the current event (i.e., the event that this method was called from).

If Synchronize is true, this method will execute in the context of the request thread (which is important for on-the-fly file data modification like encryption, etc.), and the following restrictions will apply:

  • The method may only be called within the AfterCreateFile and AfterOpenFile events, and only for the file or directory that the event fired for.
  • The DesiredAccess, CreationDisposition, and FlagsAndAttributes parameters are ignored.
  • Files will be opened without buffering, which means that applications must comply with all restrictions imposed by the FILE_FLAG_NO_BUFFERING flag when reading and writing file data. Please refer to Microsoft's File Buffering article for more information.

If Synchronize is false, this method is not synchronized with the request thread, and the restrictions described above do not apply. This provides applications with greater flexibility since the returned file handle can be used in any event (so long as its handler complies with the general restrictions described by the Avoiding Deadlocks and Recursive Calls topics).

Error Handling (C++)

This method returns a Long64 value; after it returns, call the GetLastErrorCode() method to obtain its result code; 0 indicates success, while a non-zero error code indicates that this method encountered an error during its execution. If an error occurs, the GetLastError() method can be called to retrieve the associated error message.

 
 
Copyright (c) 2020 Callback Technologies, Inc. - All rights reserved.
CBFS Filter 2020 C++ Edition - Version 20.0 [Build 7543]