12#if _WIN32_WINNT != _WIN32_WINNT_VISTA
13#error "This file must be compiled with _WIN32_WINNT == _WIN32_WINNT_VISTA"
17#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
138 OUT APPLICATION_RECOVERY_CALLBACK* pRecoveryCallback,
193 DWORD dwPingInterval,
235 ULONG dwCreateOptions;
238 if(!lpSymlinkFileName || !lpTargetFileName || (
dwFlags | SYMBOLIC_LINK_FLAG_DIRECTORY) != SYMBOLIC_LINK_FLAG_DIRECTORY)
244 if(
dwFlags & SYMBOLIC_LINK_FLAG_DIRECTORY)
254 bRelativePath =
TRUE;
261 SIZE_T cchTargetFullFileName;
265 if(cchTargetFullFileName == 0)
271 lpTargetFullFileName =
RtlAllocateHeap(RtlGetProcessHeap(), 0, cchTargetFullFileName *
sizeof(
WCHAR));
273 if(lpTargetFullFileName ==
NULL)
279 if(
GetFullPathNameW(lpTargetFileName, cchTargetFullFileName, lpTargetFullFileName, &FilePart) == 0)
286 lpTargetFileName = lpTargetFullFileName;
297 bAllocatedTarget =
TRUE;
303 cbPrintName =
wcslen(lpTargetFileName) *
sizeof(
WCHAR);
307 if(pReparseData ==
NULL)
394 if (bAllocatedTarget)
401 if(lpTargetFullFileName)
402 RtlFreeHeap(RtlGetProcessHeap(), 0, lpTargetFullFileName);
429 if(!lpSymlinkFileName || !lpTargetFileName)
467 if (cchFilePath != 0 &&
468 cchFilePath >
sizeof(FilePathW) /
sizeof(FilePathW[0]))
485 FilePathU.
Buffer = FilePathW;
509 if (FilePathU.
Buffer != FilePathW)
608 PWSTR pwszFileMUIPath,
627 PULONG pcchLanguagesBuffer)
629 DPRINT1(
"%x %p %p %p\n",
dwFlags, pulNumLanguages, pwszLanguagesBuffer, pcchLanguagesBuffer);
644 PULONG pcchLanguagesBuffer)
646 DPRINT1(
"%x %p %p %p\n",
dwFlags, pulNumLanguages, pwszLanguagesBuffer, pcchLanguagesBuffer);
660 PULONG pcchLanguagesBuffer)
662 DPRINT1(
"%x %p %p %p\n",
dwFlags, pulNumLanguages, pwszLanguagesBuffer, pcchLanguagesBuffer);
688 PDWORD pcchFallbackLanguages,
691 DPRINT1(
"%x %p %p %p %p\n",
dwFlags, pwmszLanguage, pwszFallbackLanguages, pcchFallbackLanguages, pdwAttributes);
706 PULONG pcchLanguagesBuffer)
708 DPRINT1(
"%x %p %p %p\n",
dwFlags, pulNumLanguages, pwszLanguagesBuffer, pcchLanguagesBuffer);
724 DPRINT1(
"%x %p %p\n",
dwFlags, pwszLanguagesBuffer, pulNumLanguages);
741 DPRINT1(
"%x %p %p\n",
dwFlags, pwszLanguagesBuffer, pulNumLanguages);
#define FILE_DIRECTORY_FILE
#define FILE_NON_DIRECTORY_FILE
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define ERROR_NOT_ENOUGH_MEMORY
#define NT_SUCCESS(StatCode)
#define ERROR_CALL_NOT_IMPLEMENTED
#define ERROR_INVALID_PARAMETER
#define INVALID_HANDLE_VALUE
#define FILE_ATTRIBUTE_NORMAL
#define WideCharToMultiByte
PWCHAR FilenameA2W(LPCSTR NameA, BOOL alloc)
DWORD FilenameU2A_FitOrFail(LPSTR DestA, INT destLen, PUNICODE_STRING SourceU)
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
DWORD WINAPI GetFinalPathNameByHandleW(_In_ HANDLE hFile, _Out_writes_(cchFilePath) LPWSTR lpszFilePath, _In_ DWORD cchFilePath, _In_ DWORD dwFlags)
BOOL WINAPI DECLSPEC_HOTPATCH SetProcessPreferredUILanguages(DWORD flags, PCZZWSTR buffer, ULONG *count)
BOOL WINAPI DECLSPEC_HOTPATCH GetProcessPreferredUILanguages(DWORD flags, ULONG *count, WCHAR *buffer, ULONG *size)
LANGID WINAPI DECLSPEC_HOTPATCH GetThreadUILanguage(void)
static const WCHAR Cleanup[]
UNICODE_STRING * PUNICODE_STRING
struct _UNICODE_STRING UNICODE_STRING
@ FileDispositionInformation
#define FILE_OPEN_REPARSE_POINT
#define FILE_SYNCHRONOUS_IO_NONALERT
#define WC_NO_BEST_FIT_CHARS
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_CASE_INSENSITIVE
@ ProcessImageFileNameWin32
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
HRESULT WINAPI RegisterApplicationRecoveryCallback(IN APPLICATION_RECOVERY_CALLBACK pRecoveryCallback, IN PVOID pvParameter OPTIONAL, DWORD dwPingInterval, DWORD dwFlags)
HANDLE WINAPI OpenFileById(IN HANDLE hFile, IN LPFILE_ID_DESCRIPTOR lpFileID, IN DWORD dwDesiredAccess, IN DWORD dwShareMode, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes OPTIONAL, IN DWORD dwFlags)
BOOLEAN WINAPI CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName, IN LPCWSTR lpTargetFileName, IN DWORD dwFlags)
BOOL WINAPI QueryFullProcessImageNameW(_In_ HANDLE hProcess, _In_ DWORD dwFlags, _Out_writes_to_(*lpdwSize, *lpdwSize) LPWSTR lpExeName, _Inout_ PDWORD lpdwSize)
BOOL WINAPI SetFileBandwidthReservation(IN HANDLE hFile, IN DWORD nPeriodMilliseconds, IN DWORD nBytesPerPeriod, IN BOOL bDiscardable, OUT LPDWORD lpTransferSize, OUT LPDWORD lpNumOutstandingRequests)
HRESULT WINAPI RegisterApplicationRestart(IN PCWSTR pwzCommandline OPTIONAL, IN DWORD dwFlags)
HRESULT WINAPI GetApplicationRestart(IN HANDLE hProcess, OUT PWSTR pwzCommandline OPTIONAL, IN OUT PDWORD pcchSize, OUT PDWORD pdwFlags OPTIONAL)
BOOL WINAPI GetUserPreferredUILanguages(DWORD dwFlags, PULONG pulNumLanguages, PZZWSTR pwszLanguagesBuffer, PULONG pcchLanguagesBuffer)
BOOL WINAPI GetThreadPreferredUILanguages(DWORD dwFlags, PULONG pulNumLanguages, PZZWSTR pwszLanguagesBuffer, PULONG pcchLanguagesBuffer)
BOOL WINAPI GetSystemPreferredUILanguages(DWORD dwFlags, PULONG pulNumLanguages, PZZWSTR pwszLanguagesBuffer, PULONG pcchLanguagesBuffer)
BOOL WINAPI GetFileMUIPath(DWORD dwFlags, PCWSTR pcwszFilePath, PWSTR pwszLanguage, PULONG pcchLanguage, PWSTR pwszFileMUIPath, PULONG pcchFileMUIPath, PULONGLONG pululEnumerator)
BOOL WINAPI QueryFullProcessImageNameA(_In_ HANDLE hProcess, _In_ DWORD dwFlags, _Out_writes_to_(*lpdwSize, *lpdwSize) LPSTR lpExeName, _Inout_ PDWORD lpdwSize)
BOOL WINAPI SetThreadPreferredUILanguages(DWORD dwFlags, PCZZWSTR pwszLanguagesBuffer, PULONG pulNumLanguages)
BOOL WINAPI GetUILanguageInfo(DWORD dwFlags, PCZZWSTR pwmszLanguage, PZZWSTR pwszFallbackLanguages, PDWORD pcchFallbackLanguages, PDWORD pdwAttributes)
HRESULT WINAPI GetApplicationRecoveryCallback(IN HANDLE hProcess, OUT APPLICATION_RECOVERY_CALLBACK *pRecoveryCallback, OUT PVOID *ppvParameter, PDWORD dwPingInterval, PDWORD dwFlags)
BOOL WINAPI GetFileMUIInfo(DWORD dwFlags, PCWSTR pcwszFilePath, PFILEMUIINFO pFileMUIInfo, DWORD *pcbFileMUIInfo)
VOID WINAPI ApplicationRecoveryFinished(IN BOOL bSuccess)
BOOLEAN NTAPI CreateSymbolicLinkA(IN LPCSTR lpSymlinkFileName, IN LPCSTR lpTargetFileName, IN DWORD dwFlags)
BOOL WINAPI GetFileBandwidthReservation(IN HANDLE hFile, OUT LPDWORD lpPeriodMilliseconds, OUT LPDWORD lpBytesPerPeriod, OUT LPBOOL pDiscardable, OUT LPDWORD lpTransferSize, OUT LPDWORD lpNumOutstandingRequests)
#define REPARSE_DATA_BUFFER_HEADER_SIZE
DWORD WINAPI GetFinalPathNameByHandleA(IN HANDLE hFile, OUT LPSTR lpszFilePath, IN DWORD cchFilePath, IN DWORD dwFlags)
HRESULT WINAPI ApplicationRecoveryInProgress(OUT PBOOL pbCancelled)
_In_ BOOL _In_ HANDLE hProcess
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
static LPFILE_ID_DESCRIPTOR
static DWORD LPSTR PDWORD lpdwSize
static DWORD LPSTR lpExeName
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI RTL_PATH_TYPE NTAPI RtlDetermineDosPathNameType_U(_In_ PCWSTR Path)
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToNtPathName_U(_In_opt_z_ PCWSTR DosPathName, _Out_ PUNICODE_STRING NtPathName, _Out_opt_ PCWSTR *NtFileNamePart, _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo)
@ RtlPathTypeRootLocalDevice
@ RtlPathTypeDriveRelative
@ RtlPathTypeDriveAbsolute
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
#define _Out_writes_to_(s, c)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
#define FILE_WRITE_ATTRIBUTES
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)
NTSYSAPI NTSTATUS NTAPI NtFsControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
_NullNull_terminated_ WCHAR * PZZWSTR
_NullNull_terminated_ CONST WCHAR * PCZZWSTR
static OUT PIO_STATUS_BLOCK IoStatusBlock
NTSTATUS NTAPI NtQueryInformationProcess(_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_writes_bytes_to_opt_(ProcessInformationLength, *ReturnLength) PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength)
#define STATUS_INVALID_PARAMETER_2
#define FSCTL_SET_REPARSE_POINT
DWORD BaseSetLastNTError(IN NTSTATUS Status)
#define STATUS_BUFFER_TOO_SMALL
PULONG MinorVersion OPTIONAL
struct _REPARSE_DATA_BUFFER::@347::@349 SymbolicLinkReparseBuffer
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define STATUS_INFO_LENGTH_MISMATCH
#define PROCESS_NAME_NATIVE
DWORD WINAPI GetLastError(void)
#define ERROR_PATH_NOT_FOUND
_In_ PCWSTR _Inout_updates_bytes_to_opt_ pcbFileMUIInfo PFILEMUIINFO _Inout_ DWORD * pcbFileMUIInfo
_In_ PCWSTR _Inout_updates_bytes_to_opt_ pcbFileMUIInfo PFILEMUIINFO pFileMUIInfo
_In_ PCWSTR pcwszFilePath
#define IO_REPARSE_TAG_SYMLINK