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);
472 CurrentDirPlacement = *(
PULONG)PartialInfo.
Data;
495 CurrentDirPlacement = OldCurrentDirPlacement;
525 CurDir = &
NtCurrentPeb()->ProcessParameters->CurrentDirectory.DosPath;
527 CurLength = CurDir->
Length;
539 CurDirCopy = *CurDir;
602 HasExtension =
FALSE;
612 if ((!(HasExtension) && (
i >= 7)) || (
i == AnsiName.
Length - 1))
631 if ((HasExtension) || (Dots > 3))
return FALSE;
638 if ((
i >= 8) && !(HasExtension))
return FALSE;
657 HasExtension =
FALSE;
664 if ((HasExtension) || (Dots > 3))
672 if ((
i >= 8) && (!HasExtension))
return TRUE;
702 while ((*
p) && ((*
p !=
L'\\') && (*
p !=
L'/')))
p++;
717 if ((
First) && (Last))
751 for (ReturnPath =
Path + 2,
i = 2; (
i > 0) && (*ReturnPath); ReturnPath++)
754 if ((*ReturnPath ==
L'\\') || (*ReturnPath ==
L'/'))
i--;
785 RtlInitEmptyUnicodeString(&EmptyString,
NULL, 0);
845 if (
strchr(lpPathName,
';'))
999 ULONG PathSize, FilePartSize;
1009 FilePartSize = PathSize = 0;
1038 if ((PathSize) && (
lpFilePart) && (LocalFilePart))
1061 if (!PathSize)
goto Quickie;
1132 ULONG PathSize, FilePartSize, AnsiLength;
1146 if (!FileNameString)
return 0;
1184 if (!PathSize)
goto Quickie;
1199 PathSize = AnsiLength + 1;
1208 PathSize *
sizeof(
WCHAR));
1219 PathSize = AnsiLength;
1267 if (!PathSize)
goto Quickie;
1304 UNICODE_STRING FileNameString, ExtensionString, PathString, CallerBuffer;
1321 while ((FileNameString.
Length >=
sizeof(
WCHAR)) &&
1328 if (!FileNameString.
Length)
1409 DbgPrint(
"%s on file %wZ failed; NTSTATUS = %08lx\n",
1413 DbgPrint(
" Path = %wZ\n", &PathString);
1440 if ((PathString.
Buffer != lpPath) && (PathString.
Buffer))
1505 if (lpszLongPath != lpszShortPath)
1524 if (!Original)
goto ErrorQuickie;
1531 Last = &Original[Last - lpszShortPath];
1544 (((lpszLongPath >= lpszShortPath) && (lpszLongPath < &lpszShortPath[
Length])) ||
1545 ((lpszLongPath < lpszShortPath) && (&lpszLongPath[
cchBuffer] >= lpszShortPath))))
1548 if (!
Buffer)
goto ErrorQuickie;
1593 First = FindFileData.cFileName;
1659 if (Original)
RtlFreeHeap(RtlGetProcessHeap(), 0, Original);
1695 LongPath = LongPathBuffer;
1715 LongPathUni.
Buffer = LongPath;
1739 if ((LongPath) && (LongPath != LongPathBuffer))
1776 ShortPath = ShortPathBuffer;
1796 ShortPathUni.
Buffer = ShortPath;
1820 if ((ShortPath) && (ShortPath != ShortPathBuffer))
1886 if (lpszLongPath != lpszShortPath)
1905 if (!Original)
goto ErrorQuickie;
1912 Last = &Original[Last - lpszLongPath];
1915 Dst = lpszShortPath;
1925 (((lpszShortPath >= lpszLongPath) && (lpszShortPath < &lpszLongPath[
Length])) ||
1926 ((lpszShortPath < lpszLongPath) && (&lpszShortPath[
cchBuffer] >= lpszLongPath))))
1929 if (!
Buffer)
goto ErrorQuickie;
1974 First = FindFileData.cAlternateFileName;
2040 if (Original)
RtlFreeHeap(RtlGetProcessHeap(), 0, Original);
2082 static const WCHAR tmp[] = {
'T',
'M',
'P', 0 };
2083 static const WCHAR temp[] = {
'T',
'E',
'M',
'P', 0 };
2084 static const WCHAR userprofile[] = {
'U',
'S',
'E',
'R',
'P',
'R',
'O',
'F',
'I',
'L',
'E',0 };
2114 if (full_tmp_path[
ret-1] !=
'\\')
2116 full_tmp_path[
ret++] =
'\\';
2117 full_tmp_path[
ret] =
'\0';
2295 if (uSize < AnsiLength)
return AnsiLength;
2379 if (uSize < AnsiLength)
return AnsiLength;
IN CINT OUT PVOID IN ULONG OUT PULONG ResultLength
#define ERROR_INVALID_PARAMETER
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
UINT WINAPI SetErrorMode(IN UINT uMode)
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING KeyName
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
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
UINT WINAPI GetSystemWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
#define STATUS_INSUFFICIENT_RESOURCES
*BytesInUnicodeString PWCH UnicodeString
BOOL WINAPI IsShortName_U(IN PWCHAR Name, IN ULONG Length)
#define SEM_FAILCRITICALERRORS
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
PRTL_CONVERT_STRINGA BasepUnicodeStringTo8BitString
#define STATUS_INVALID_PARAMETER
NTSYSAPI NTSTATUS WINAPI RtlInitAnsiStringEx(PANSI_STRING, PCSZ)
GLuint GLuint GLsizei count
NTSYSAPI NTSTATUS NTAPI RtlUnicodeToMultiByteSize(PULONG MbSize, PCWCH UnicodeString, ULONG UnicodeSize)
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)
#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)
_In_ PUNICODE_STRING ValueName
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)
_Must_inspect_result_ _In_ ULONG Flags
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
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)
_Check_return_ _CRTIMP _CONST_RETURN wchar_t *__cdecl wcsrchr(_In_z_ const wchar_t *_Str, _In_ wchar_t _Ch)
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)
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)
#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)
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)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define INVALID_FILE_ATTRIBUTES
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define OBJ_CASE_INSENSITIVE
BASE_CURRENT_DIR_PLACEMENT BasepDllCurrentDirPlacement
ULONG NTAPI RtlGetCurrentDirectory_U(_In_ ULONG MaximumLength, _Out_bytecap_(MaximumLength) PWSTR Buffer)
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeToMultiByteN(PCHAR MbString, ULONG MbSize, PULONG ResultSize, PCWCH UnicodeString, ULONG UnicodeSize)
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
DWORD FilenameW2A_FitOrFail(LPSTR DestA, INT destLen, LPCWSTR SourceW, INT sourceLen)
#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)
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)
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
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
NTSYSAPI NTSTATUS WINAPI RtlInitUnicodeStringEx(PUNICODE_STRING, PCWSTR)
#define SEM_NOOPENFILEERRORBOX
PRTL_CONVERT_STRING Basep8BitStringToUnicodeString
VOID NTAPI RtlAcquirePebLock(VOID)
LPWSTR WINAPI BaseComputeProcessExePath(IN LPWSTR FullPath)
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
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ SECURITY_INFORMATION _In_ ULONG _Out_opt_ PULONG LengthNeeded
UNICODE_STRING NoDefaultCurrentDirectoryInExePath
IN BOOLEAN OUT PSTR Buffer
#define GetEnvironmentVariableW(x, y, z)
BASE_SEARCH_PATH_TYPE BaseDllOrderCurrent[BaseCurrentDirPlacementMax][BaseSearchPathMax]
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
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