91 PWCHAR FileNameEnd, FileNameSeparator;
95 if (FileNameSeparator)
102 if (FileNameEnd == FileNameSeparator) FileNameEnd++;
129 PathLengthInBytes = 0;
153 PathLengthInBytes += (2 *
sizeof(
WCHAR));
218 PathLengthInBytes += (EnvPath.
Length +
sizeof(
L';'));
237 if (!(
AppName) || !(AppNameEnd))
270 PathLengthInBytes += ((AppNameEnd -
AppName) *
sizeof(
WCHAR)) +
sizeof(
L';');
280 ASSERT(PathLengthInBytes > 0);
281 ASSERT(!(PathLengthInBytes & 1));
284 PathBuffer =
RtlAllocateHeap(RtlGetProcessHeap(), 0, PathLengthInBytes);
293 PathCurrent = PathBuffer;
309 *PathCurrent++ =
';';
318 ASSERT(((PathCurrent - PathBuffer + 1 + (AppNameEnd -
AppName)) *
sizeof(
WCHAR)) <= PathLengthInBytes);
324 PathCurrent += AppNameEnd -
AppName;
325 *PathCurrent++ =
';';
344 ASSERT((((PathCurrent - PathBuffer + 1) *
sizeof(
WCHAR)) + EnvPath.
Length) <= PathLengthInBytes);
349 *PathCurrent++ =
';';
357 ASSERT(((PathCurrent - PathBuffer + 2) *
sizeof(
WCHAR)) <= PathLengthInBytes);
358 *PathCurrent++ =
'.';
361 *PathCurrent++ =
';';
370 ASSERT((PathCurrent - PathBuffer) *
sizeof(
WCHAR) == PathLengthInBytes);
371 ASSERT(PathCurrent > PathBuffer);
397 DPRINT(
"Computing Process Search path\n");
408 DPRINT(
"Computing EXE path: %S\n", FullPath);
465 sizeof(PartialInfoBuffer),
473 CurrentDirPlacement = *(
PULONG)PartialInfo->
Data;
496 CurrentDirPlacement = OldCurrentDirPlacement;
526 CurDir = &
NtCurrentPeb()->ProcessParameters->CurrentDirectory.DosPath;
528 CurLength = CurDir->
Length;
540 CurDirCopy = *CurDir;
603 HasExtension =
FALSE;
613 if ((!(HasExtension) && (
i >= 7)) || (
i == AnsiName.
Length - 1))
632 if ((HasExtension) || (Dots > 3))
return FALSE;
639 if ((
i >= 8) && !(HasExtension))
return FALSE;
658 HasExtension =
FALSE;
665 if ((HasExtension) || (Dots > 3))
673 if ((
i >= 8) && (!HasExtension))
return TRUE;
703 while ((*
p) && ((*
p !=
L'\\') && (*
p !=
L'/')))
p++;
718 if ((
First) && (Last))
752 for (ReturnPath =
Path + 2,
i = 2; (
i > 0) && (*ReturnPath); ReturnPath++)
755 if ((*ReturnPath ==
L'\\') || (*ReturnPath ==
L'/'))
i--;
786 RtlInitEmptyUnicodeString(&EmptyString,
NULL, 0);
846 if (
strchr(lpPathName,
';'))
1000 ULONG PathSize, FilePartSize;
1010 FilePartSize = PathSize = 0;
1039 if ((PathSize) && (
lpFilePart) && (LocalFilePart))
1062 if (!PathSize)
goto Quickie;
1133 ULONG PathSize, FilePartSize, AnsiLength;
1147 if (!FileNameString)
return 0;
1185 if (!PathSize)
goto Quickie;
1200 PathSize = AnsiLength + 1;
1209 PathSize *
sizeof(
WCHAR));
1220 PathSize = AnsiLength;
1268 if (!PathSize)
goto Quickie;
1305 UNICODE_STRING FileNameString, ExtensionString, PathString, CallerBuffer;
1322 while ((FileNameString.
Length >=
sizeof(
WCHAR)) &&
1329 if (!FileNameString.
Length)
1410 DbgPrint(
"%s on file %wZ failed; NTSTATUS = %08lx\n",
1414 DbgPrint(
" Path = %wZ\n", &PathString);
1441 if ((PathString.
Buffer != lpPath) && (PathString.
Buffer))
1506 if (lpszLongPath != lpszShortPath)
1525 if (!Original)
goto ErrorQuickie;
1532 Last = &Original[Last - lpszShortPath];
1545 (((lpszLongPath >= lpszShortPath) && (lpszLongPath < &lpszShortPath[
Length])) ||
1546 ((lpszLongPath < lpszShortPath) && (&lpszLongPath[
cchBuffer] >= lpszShortPath))))
1549 if (!
Buffer)
goto ErrorQuickie;
1594 First = FindFileData.cFileName;
1660 if (Original)
RtlFreeHeap(RtlGetProcessHeap(), 0, Original);
1696 LongPath = LongPathBuffer;
1716 LongPathUni.
Buffer = LongPath;
1740 if ((LongPath) && (LongPath != LongPathBuffer))
1777 ShortPath = ShortPathBuffer;
1797 ShortPathUni.
Buffer = ShortPath;
1821 if ((ShortPath) && (ShortPath != ShortPathBuffer))
1887 if (lpszLongPath != lpszShortPath)
1906 if (!Original)
goto ErrorQuickie;
1913 Last = &Original[Last - lpszLongPath];
1916 Dst = lpszShortPath;
1926 (((lpszShortPath >= lpszLongPath) && (lpszShortPath < &lpszLongPath[
Length])) ||
1927 ((lpszShortPath < lpszLongPath) && (&lpszShortPath[
cchBuffer] >= lpszLongPath))))
1930 if (!
Buffer)
goto ErrorQuickie;
1975 First = FindFileData.cAlternateFileName;
2041 if (Original)
RtlFreeHeap(RtlGetProcessHeap(), 0, Original);
2083 static const WCHAR tmp[] = {
'T',
'M',
'P', 0 };
2084 static const WCHAR temp[] = {
'T',
'E',
'M',
'P', 0 };
2085 static const WCHAR userprofile[] = {
'U',
'S',
'E',
'R',
'P',
'R',
'O',
'F',
'I',
'L',
'E',0 };
2115 if (full_tmp_path[
ret-1] !=
'\\')
2117 full_tmp_path[
ret++] =
'\\';
2118 full_tmp_path[
ret] =
'\0';
2296 if (uSize < AnsiLength)
return AnsiLength;
2380 if (uSize < AnsiLength)
return AnsiLength;
#define ERROR_INVALID_PARAMETER
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
UINT WINAPI SetErrorMode(IN UINT uMode)
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
UNICODE_STRING BaseDefaultPath
PVOID PVOID PWCHAR PVOID Environment
BOOL WINAPI BasepIsCurDirAllowedForPlainExeNames(VOID)
PUNICODE_STRING WINAPI Basep8BitStringToStaticUnicodeString(IN LPCSTR String)
UINT WINAPI GetSystemWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
_In_ LPCSTR _In_opt_ LPCSTR _In_ DWORD _Out_opt_ LPSTR * lpFilePart
UINT WINAPI GetSystemWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG _In_ ULONG _In_ ULONG Length
BOOL WINAPI IsShortName_U(IN PWCHAR Name, IN ULONG Length)
NTSYSAPI NTSTATUS WINAPI RtlInitUnicodeStringEx(PUNICODE_STRING, PCWSTR)
_Use_decl_annotations_ NTSTATUS NTAPI RtlUnicodeToMultiByteN(_Out_ PCHAR MbString, _In_ ULONG MbSize, _Out_opt_ PULONG ResultSize, _In_ PCWCH UnicodeString, _In_ ULONG UnicodeSize)
#define SEM_FAILCRITICALERRORS
#define OBJ_CASE_INSENSITIVE
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
NTSYSAPI NTSTATUS WINAPI RtlInitAnsiStringEx(PANSI_STRING, PCSZ)
IN BOOLEAN OUT PSTR Buffer
PRTL_CONVERT_STRINGA BasepUnicodeStringTo8BitString
#define STATUS_INVALID_PARAMETER
GLuint GLuint GLsizei count
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
IN PDCB IN POEM_STRING IN PUNICODE_STRING UnicodeName
static CHAR AppName[MAX_PATH]
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
PVOID gpTermsrvGetWindowsDirectoryA
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define InterlockedCompareExchange
#define ERROR_NOT_ENOUGH_MEMORY
#define INVALID_HANDLE_VALUE
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
VOID NTAPI RtlReleasePebLock(VOID)
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_opt_ PCUNICODE_STRING UnicodeString
#define UNICODE_STRING_MAX_BYTES
BOOL WINAPI NeedCurrentDirectoryForExePathA(IN LPCSTR ExeName)
UNICODE_STRING BaseDllDirectory
#define RtlMoveMemory(Destination, Source, Length)
#define STATUS_BUFFER_TOO_SMALL
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
LPWSTR WINAPI BaseComputeProcessSearchPath(VOID)
DWORD WINAPI GetLongPathNameA(IN LPCSTR lpszShortPath, OUT LPSTR lpszLongPath, IN DWORD cchBuffer)
DWORD WINAPI GetFullPathNameA(IN LPCSTR lpFileName, IN DWORD nBufferLength, OUT LPSTR lpBuffer, OUT LPSTR *lpFilePart)
ULONG NTAPI RtlGetFullPathName_U(_In_ PCWSTR FileName, _In_ ULONG Size, _Out_z_bytecap_(Size) PWSTR Buffer, _Out_opt_ PWSTR *ShortName)
DWORD WINAPI GetDllDirectoryA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
BOOL WINAPI IsLongName_U(IN PWCHAR FileName, IN ULONG Length)
BOOL WINAPI FindLFNorSFN_U(IN PWCHAR Path, OUT PWCHAR *First, OUT PWCHAR *Last, IN BOOL UseShort)
BOOLEAN WINAPI Basep8BitStringToDynamicUnicodeString(OUT PUNICODE_STRING UnicodeString, IN LPCSTR String)
BASE_SEARCH_PATH_TYPE BaseProcessOrderNoCurrent[BaseSearchPathMax]
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
DWORD WINAPI SearchPathA(IN LPCSTR lpPath OPTIONAL, IN LPCSTR lpFileName, IN LPCSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPSTR lpBuffer, OUT LPSTR *lpFilePart OPTIONAL)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
PWCHAR WINAPI BasepEndOfDirName(IN PWCHAR FileName)
#define OBJ_NAME_PATH_SEPARATOR
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
PWCHAR WINAPI SkipPathTypeIndicator_U(IN LPWSTR Path)
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
NTSYSAPI NTSTATUS NTAPI RtlQueryEnvironmentVariable_U(_In_opt_ PWSTR Environment, _In_ PCUNICODE_STRING Name, _Out_ PUNICODE_STRING Value)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
BOOL WINAPI IsDBCSLeadByte(BYTE TestByte)
UINT WINAPI GetSystemWow64DirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
DWORD BaseSetLastNTError(IN NTSTATUS Status)
BOOL WINAPI NeedCurrentDirectoryForExePathW(IN LPCWSTR ExeName)
BOOL WINAPI SetDllDirectoryA(IN LPCSTR lpPathName)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
BOOLEAN WINAPI CheckForSameCurdir(IN PUNICODE_STRING DirName)
PLDR_DATA_TABLE_ENTRY BasepExeLdrEntry
_In_ LPCSTR _In_opt_ LPCSTR _In_ DWORD nBufferLength
#define STATUS_NAME_TOO_LONG
PVOID gpTermsrvGetWindowsDirectoryW
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
NTSYSAPI NTSTATUS NTAPI NtQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
DWORD WINAPI GetLongPathNameW(IN LPCWSTR lpszShortPath, OUT LPWSTR lpszLongPath, IN DWORD cchBuffer)
_Must_inspect_result_ _In_ ULONG Flags
#define UNICODE_STRING_MAX_CHARS
UNICODE_STRING BaseWindowsDirectory
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
NTSTATUS NTAPI RtlSetCurrentDirectory_U(IN PUNICODE_STRING Path)
#define NT_SUCCESS(StatCode)
struct _KEY_VALUE_PARTIAL_INFORMATION * PKEY_VALUE_PARTIAL_INFORMATION
DWORD WINAPI GetShortPathNameW(IN LPCWSTR lpszLongPath, OUT LPWSTR lpszShortPath, IN DWORD cchBuffer)
DWORD WINAPI GetShortPathNameA(IN LPCSTR lpszLongPath, OUT LPSTR lpszShortPath, IN DWORD cchBuffer)
NTSYSAPI VOID NTAPI RtlFreeAnsiString(PANSI_STRING AnsiString)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define INVALID_FILE_ATTRIBUTES
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
BASE_CURRENT_DIR_PLACEMENT BasepDllCurrentDirPlacement
ULONG NTAPI RtlGetCurrentDirectory_U(_In_ ULONG MaximumLength, _Out_bytecap_(MaximumLength) PWSTR Buffer)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define STATUS_VARIABLE_NOT_FOUND
UINT WINAPI GetSystemWow64DirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
BOOL WINAPI SetCurrentDirectoryA(IN LPCSTR lpPathName)
RTL_PATH_TYPE NTAPI RtlDetermineDosPathNameType_U(IN PCWSTR Path)
NTSTATUS NTAPI LdrEnumerateLoadedModules(IN BOOLEAN ReservedFlag, IN PLDR_ENUM_CALLBACK EnumProc, IN PVOID Context)
VOID NTAPI BasepLocateExeLdrEntry(IN PLDR_DATA_TABLE_ENTRY Entry, IN PVOID Context, OUT BOOLEAN *StopEnumeration)
_In_ LPCSTR _In_opt_ LPCSTR lpExtension
DWORD WINAPI SearchPathW(IN LPCWSTR lpPath OPTIONAL, IN LPCWSTR lpFileName, IN LPCWSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart OPTIONAL)
RTL_CRITICAL_SECTION BaseDllDirectoryLock
LPWSTR WINAPI BaseComputeProcessDllPath(IN LPWSTR FullPath, IN PVOID Environment)
enum _BASE_SEARCH_PATH_TYPE * PBASE_SEARCH_PATH_TYPE
#define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
PRTL_UNICODE_STRING_BUFFER Path
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
PRTL_COUNT_STRING BasepUnicodeStringTo8BitSize
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
BASE_SEARCH_PATH_TYPE BaseProcessOrder[BaseSearchPathMax]
BOOL WINAPI SetDllDirectoryW(IN LPCWSTR lpPathName)
_Use_decl_annotations_ NTSTATUS NTAPI RtlUnicodeToMultiByteSize(_Out_ PULONG MbSize, _In_ PCWCH UnicodeString, _In_ ULONG UnicodeSize)
UNICODE_STRING BaseDefaultPathAppend
static const char const char * DllPath
UNICODE_STRING BasePathVariableName
BOOL WINAPI SetCurrentDirectoryW(IN LPCWSTR lpPathName)
DWORD WINAPI GetCurrentDirectoryA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
#define STATUS_NO_SUCH_FILE
DWORD WINAPI GetDllDirectoryW(IN DWORD nBufferLength, OUT LPWSTR lpBuffer)
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
UNICODE_STRING FullDllName
#define FIELD_OFFSET(t, f)
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
#define SEM_NOOPENFILEERRORBOX
PRTL_CONVERT_STRING Basep8BitStringToUnicodeString
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
VOID NTAPI RtlAcquirePebLock(VOID)
LPWSTR WINAPI BaseComputeProcessExePath(IN LPWSTR FullPath)
DWORD FilenameW2A_FitOrFail(LPSTR DestA, INT destLen, LPCWSTR SourceW, INT sourceLen)
char * strchr(const char *String, int ch)
#define UNIMPLEMENTED_DBGBREAK(...)
DWORD WINAPI GetCurrentDirectoryW(IN DWORD nBufferLength, OUT LPWSTR lpBuffer)
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
#define ERROR_CALL_NOT_IMPLEMENTED
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
_In_ PFCB _In_ PCD_NAME DirName
enum _BASE_CURRENT_DIR_PLACEMENT BASE_CURRENT_DIR_PLACEMENT
#define RtlCopyMemory(Destination, Source, Length)
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ SECURITY_INFORMATION _In_ ULONG _Out_opt_ PULONG LengthNeeded
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
UNICODE_STRING NoDefaultCurrentDirectoryInExePath
#define GetEnvironmentVariableW(x, y, z)
BASE_SEARCH_PATH_TYPE BaseDllOrderCurrent[BaseCurrentDirPlacementMax][BaseSearchPathMax]
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
enum _BASE_SEARCH_PATH_TYPE BASE_SEARCH_PATH_TYPE
IN PUNICODE_STRING StaticString
LPWSTR WINAPI BasepComputeProcessPath(IN PBASE_SEARCH_PATH_TYPE PathOrder, IN LPWSTR AppName, IN LPVOID Environment)
NTSTATUS NTAPI RtlDosSearchPath_Ustr(IN ULONG Flags, IN PUNICODE_STRING PathString, IN PUNICODE_STRING FileNameString, IN PUNICODE_STRING ExtensionString, IN PUNICODE_STRING CallerBuffer, IN OUT PUNICODE_STRING DynamicString OPTIONAL, OUT PUNICODE_STRING *FullNameOut OPTIONAL, OUT PSIZE_T FilePartSize OPTIONAL, OUT PSIZE_T LengthNeeded OPTIONAL)
BASE_SEARCH_PATH_TYPE BaseDllOrderNoCurrent[BaseSearchPathMax]
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
UNICODE_STRING BaseWindowsSystemDirectory
#define ERROR_FILENAME_EXCED_RANGE
#define RTL_CONSTANT_STRING(s)
BOOL WINAPI FindClose(HANDLE hFindFile)
PULONG MinorVersion OPTIONAL