222{
235 ULONG dwCreateOptions;
237
238 if(!lpSymlinkFileName || !lpTargetFileName || (
dwFlags | SYMBOLIC_LINK_FLAG_DIRECTORY) != SYMBOLIC_LINK_FLAG_DIRECTORY)
239 {
242 }
243
244 if(
dwFlags & SYMBOLIC_LINK_FLAG_DIRECTORY)
246 else
248
250 {
254 bRelativePath =
TRUE;
256 break;
257
259 {
261 SIZE_T cchTargetFullFileName;
262
264
265 if(cchTargetFullFileName == 0)
266 {
269 }
270
271 lpTargetFullFileName =
RtlAllocateHeap(RtlGetProcessHeap(), 0, cchTargetFullFileName *
sizeof(
WCHAR));
272
273 if(lpTargetFullFileName ==
NULL)
274 {
277 }
278
279 if(
GetFullPathNameW(lpTargetFileName, cchTargetFullFileName, lpTargetFullFileName, &FilePart) == 0)
280 {
283 }
284 }
285
286 lpTargetFileName = lpTargetFullFileName;
287
288
289
294 default:
296 {
297 bAllocatedTarget =
TRUE;
300 }
301 }
302
303 cbPrintName =
wcslen(lpTargetFileName) *
sizeof(
WCHAR);
306
307 if(pReparseData ==
NULL)
308 {
311 }
312
314
318
323
328
330
331 if(bRelativePath)
333
335 {
338 }
339
341
343 (
344 &hSymlink,
350 0,
354 0
355 );
356
358 {
361 }
362
364 (
365 hSymlink,
371 pReparseData,
372 cbReparseData,
374 0
375 );
376
378 {
382
385 }
386
388
390 if(hSymlink)
392
394 if (bAllocatedTarget)
395 {
397 0,
399 }
400
401 if(lpTargetFullFileName)
402 RtlFreeHeap(RtlGetProcessHeap(), 0, lpTargetFullFileName);
403
404 if(pReparseData)
406
408 {
411 }
412
414}
#define FILE_DIRECTORY_FILE
#define FILE_NON_DIRECTORY_FILE
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define ERROR_NOT_ENOUGH_MEMORY
#define NT_SUCCESS(StatCode)
#define FILE_ATTRIBUTE_NORMAL
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
static const WCHAR Cleanup[]
@ FileDispositionInformation
#define FILE_OPEN_REPARSE_POINT
#define FILE_SYNCHRONOUS_IO_NONALERT
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_CASE_INSENSITIVE
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
#define REPARSE_DATA_BUFFER_HEADER_SIZE
#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
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)
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define FSCTL_SET_REPARSE_POINT
struct _REPARSE_DATA_BUFFER::@347::@349 SymbolicLinkReparseBuffer
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
DWORD WINAPI GetLastError(void)
#define ERROR_PATH_NOT_FOUND
#define IO_REPARSE_TAG_SYMLINK