Why are you putting SEH everywhere??? Just to avoid goto? This is infinitely retarded. Exceptions should not be used as a mechanism for flow control.
Best regards, Alex Ionescu On Sat, Sep 24, 2011 at 3:51 AM, <pschweit...@svn.reactos.org> wrote: > Author: pschweitzer > Date: Sat Sep 24 07:51:21 2011 > New Revision: 53823 > > URL: http://svn.reactos.org/svn/reactos?rev=53823&view=rev > Log: > [KERNEL32] > Simplify overcomplicated function CreateHardlinkW(), and SEHify it. > > Modified: > trunk/reactos/dll/win32/kernel32/client/file/hardlink.c > > Modified: trunk/reactos/dll/win32/kernel32/client/file/hardlink.c > URL: > http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/file/hardlink.c?rev=53823&r1=53822&r2=53823&view=diff > > ============================================================================== > --- trunk/reactos/dll/win32/kernel32/client/file/hardlink.c [iso-8859-1] > (original) > +++ trunk/reactos/dll/win32/kernel32/client/file/hardlink.c [iso-8859-1] > Sat Sep 24 07:51:21 2011 > @@ -2,11 +2,10 @@ > * > * COPYRIGHT: See COPYING in the top level directory > * PROJECT: ReactOS system libraries > - * FILE: lib/kernel32/file/hardlink.c > + * FILE: dll/win32/kernel32/client/file/hardlink.c > * PURPOSE: Hardlink functions > * PROGRAMMER: Thomas Weidenmueller (w3s...@users.sourceforge.net) > - * UPDATE HISTORY: > - * Created 13/03/2004 > + * Pierre Schweitzer (pierre.schweit...@reactos.org) > */ > > /* INCLUDES > *****************************************************************/ > @@ -27,169 +26,110 @@ > LPCWSTR lpExistingFileName, > LPSECURITY_ATTRIBUTES lpSecurityAttributes) > { > - UNICODE_STRING LinkTarget, LinkName; > - LPVOID lpSecurityDescriptor; > - PFILE_LINK_INFORMATION LinkInformation; > - IO_STATUS_BLOCK IoStatus; > - NTSTATUS Status; > - BOOL Ret = FALSE; > + NTSTATUS Status; > + BOOL Ret = FALSE; > + ULONG NeededSize; > + IO_STATUS_BLOCK IoStatusBlock; > + OBJECT_ATTRIBUTES ObjectAttributes; > + HANDLE hTarget = INVALID_HANDLE_VALUE; > + PFILE_LINK_INFORMATION LinkInformation = NULL; > + UNICODE_STRING LinkTarget = {0, 0, NULL}, LinkName = {0, 0, NULL}; > > - if(!lpFileName || !lpExistingFileName) > - { > - SetLastError(ERROR_INVALID_PARAMETER); > - return FALSE; > - } > + TRACE("CreateHardLinkW: %S, %S, %p\n", lpFileName, lpExistingFileName, > lpSecurityAttributes); > > - lpSecurityDescriptor = (lpSecurityAttributes ? > lpSecurityAttributes->lpSecurityDescriptor : NULL); > + /* Validate parameters */ > + if(!lpFileName || !lpExistingFileName) > + { > + SetLastError(ERROR_INVALID_PARAMETER); > + return FALSE; > + } > > - if(RtlDetermineDosPathNameType_U((LPWSTR)lpFileName) == 1 || > - RtlDetermineDosPathNameType_U((LPWSTR)lpExistingFileName) == 1) > - { > - WARN("CreateHardLinkW() cannot handle UNC Paths!\n"); > - SetLastError(ERROR_INVALID_NAME); > - return FALSE; > - } > + _SEH2_TRY > + { > + /* Get target UNC path */ > + if (!RtlDosPathNameToNtPathName_U(lpExistingFileName, &LinkTarget, > NULL, NULL)) > + { > + SetLastError(ERROR_PATH_NOT_FOUND); > + _SEH2_LEAVE; > + } > > - if(RtlDosPathNameToNtPathName_U(lpExistingFileName, &LinkTarget, NULL, > NULL)) > - { > - ULONG NeededSize = RtlGetFullPathName_U((LPWSTR)lpExistingFileName, 0, > NULL, NULL); > - if(NeededSize > 0) > + /* Open target */ > + InitializeObjectAttributes(&ObjectAttributes, > + &LinkTarget, > + OBJ_CASE_INSENSITIVE, > + NULL, > + (lpSecurityAttributes ? > lpSecurityAttributes->lpSecurityDescriptor : NULL)); > + > + Status = NtOpenFile(&hTarget, > + SYNCHRONIZE | FILE_WRITE_ATTRIBUTES, > + &ObjectAttributes, > + &IoStatusBlock, > + FILE_SHARE_READ | FILE_SHARE_WRITE | > FILE_SHARE_DELETE, > + FILE_SYNCHRONOUS_IO_NONALERT | > FILE_OPEN_REPARSE_POINT); > + if (!NT_SUCCESS(Status)) > + { > + BaseSetLastNTError(Status); > + _SEH2_LEAVE; > + } > + > + /* Get UNC path name for link */ > + if (!RtlDosPathNameToNtPathName_U(lpFileName, &LinkName, NULL, > NULL)) > + { > + SetLastError(ERROR_PATH_NOT_FOUND); > + _SEH2_LEAVE; > + } > + > + /* Prepare data for link */ > + NeededSize = sizeof(FILE_LINK_INFORMATION) + LinkName.Length; > + LinkInformation = RtlAllocateHeap(RtlGetProcessHeap(), 0, > NeededSize); > + if (!LinkInformation) > + { > + SetLastError(ERROR_NOT_ENOUGH_MEMORY); > + _SEH2_LEAVE; > + } > + > + RtlMoveMemory(LinkInformation->FileName, LinkName.Buffer, > LinkName.Length); > + LinkInformation->ReplaceIfExists = FALSE; > + LinkInformation->RootDirectory = 0; > + LinkInformation->FileNameLength = LinkName.Length; > + > + /* Create hard link */ > + Status = NtSetInformationFile(hTarget, > + &IoStatusBlock, > + LinkInformation, > + NeededSize, > + FileLinkInformation); > + if (NT_SUCCESS(Status)) > + { > + Ret = TRUE; > + } > + } > + _SEH2_FINALLY > { > - LPWSTR lpNtLinkTarget = RtlAllocateHeap(RtlGetProcessHeap(), > HEAP_ZERO_MEMORY, NeededSize * sizeof(WCHAR)); > - if(lpNtLinkTarget != NULL) > - { > - LPWSTR lpFilePart; > + if (LinkTarget.Buffer) > + { > + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkTarget.Buffer); > + } > > - if(RtlGetFullPathName_U((LPWSTR)lpExistingFileName, NeededSize, > lpNtLinkTarget, &lpFilePart) && > - (*lpNtLinkTarget) != L'\0') > + if (hTarget != INVALID_HANDLE_VALUE) > { > - UNICODE_STRING CheckDrive, LinkDrive; > - WCHAR wCheckDrive[10]; > + NtClose(hTarget); > + } > > - swprintf(wCheckDrive, L"\\??\\%c:", (WCHAR)(*lpNtLinkTarget)); > - RtlInitUnicodeString(&CheckDrive, wCheckDrive); > + if (LinkName.Buffer) > + { > + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkName.Buffer); > + } > > - RtlZeroMemory(&LinkDrive, sizeof(UNICODE_STRING)); > + if (LinkInformation) > + { > + RtlFreeHeap(RtlGetProcessHeap(), 0, LinkInformation); > + } > + } > + _SEH2_END; > > - LinkDrive.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), > HEAP_ZERO_MEMORY, (MAX_PATH + 1) * sizeof(WCHAR)); > - if(LinkDrive.Buffer != NULL) > - { > - HANDLE hFile, hTarget; > - OBJECT_ATTRIBUTES ObjectAttributes; > - > - InitializeObjectAttributes(&ObjectAttributes, > - &CheckDrive, > - OBJ_CASE_INSENSITIVE, > - NULL, > - NULL); > - > - Status = NtOpenSymbolicLinkObject(&hFile, 1, > &ObjectAttributes); > - if(NT_SUCCESS(Status)) > - { > - UNICODE_STRING LanManager; > - > - RtlInitUnicodeString(&LanManager, > L"\\Device\\LanmanRedirector\\"); > - > - NtQuerySymbolicLinkObject(hFile, &LinkDrive, NULL); > - > - if(!RtlPrefixUnicodeString(&LanManager, &LinkDrive, TRUE)) > - { > - InitializeObjectAttributes(&ObjectAttributes, > - &LinkTarget, > - OBJ_CASE_INSENSITIVE, > - NULL, > - lpSecurityDescriptor); > - Status = NtOpenFile(&hTarget, > - SYNCHRONIZE | DELETE, > - &ObjectAttributes, > - &IoStatus, > - FILE_SHARE_READ | FILE_SHARE_WRITE | > FILE_SHARE_DELETE, > - FILE_SYNCHRONOUS_IO_NONALERT | > FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_REPARSE_POINT); > - if(NT_SUCCESS(Status)) > - { > - if(RtlDosPathNameToNtPathName_U(lpFileName, &LinkName, > NULL, NULL)) > - { > - NeededSize = sizeof(FILE_LINK_INFORMATION) + > LinkName.Length + sizeof(WCHAR); > - LinkInformation = RtlAllocateHeap(RtlGetProcessHeap(), > HEAP_ZERO_MEMORY, NeededSize); > - if(LinkInformation != NULL) > - { > - LinkInformation->ReplaceIfExists = FALSE; > - LinkInformation->RootDirectory = 0; > - LinkInformation->FileNameLength = LinkName.Length; > - RtlCopyMemory(LinkInformation->FileName, > LinkName.Buffer, LinkName.Length); > - > - Status = NtSetInformationFile(hTarget, &IoStatus, > LinkInformation, NeededSize, FileLinkInformation); > - if(NT_SUCCESS(Status)) > - { > - Ret = TRUE; > - } > - else > - { > - BaseSetLastNTError(Status); > - } > - > - RtlFreeHeap(RtlGetProcessHeap(), 0, > LinkInformation); > - } > - else > - { > - SetLastError(ERROR_NOT_ENOUGH_MEMORY); > - } > - } > - else > - { > - SetLastError(ERROR_PATH_NOT_FOUND); > - } > - NtClose(hTarget); > - } > - else > - { > - WARN("Unable to open link destination \"%wZ\"!\n", > &LinkTarget); > - BaseSetLastNTError(Status); > - } > - } > - else > - { > - WARN("Path \"%wZ\" must not be a mapped drive!\n", > &LinkDrive); > - SetLastError(ERROR_INVALID_NAME); > - } > - > - NtClose(hFile); > - } > - else > - { > - BaseSetLastNTError(Status); > - } > - } > - else > - { > - SetLastError(ERROR_NOT_ENOUGH_MEMORY); > - } > - } > - else > - { > - SetLastError(ERROR_INVALID_NAME); > - } > - RtlFreeHeap(RtlGetProcessHeap(), 0, lpNtLinkTarget); > - } > - else > - { > - SetLastError(ERROR_NOT_ENOUGH_MEMORY); > - } > - } > - else > - { > - SetLastError(ERROR_INVALID_NAME); > - } > - RtlFreeHeap(RtlGetProcessHeap(), 0, LinkTarget.Buffer); > - } > - else > - { > - SetLastError(ERROR_PATH_NOT_FOUND); > - } > - > - return Ret; > + return Ret; > } > - > > /* > * @implemented > @@ -199,26 +139,32 @@ > LPCSTR lpExistingFileName, > LPSECURITY_ATTRIBUTES lpSecurityAttributes) > { > - PWCHAR FileNameW, ExistingFileNameW; > - BOOL Ret; > + BOOL Ret; > + PUNICODE_STRING lpFileNameW; > + UNICODE_STRING ExistingFileNameW; > > - if(!lpFileName || !lpExistingFileName) > - { > - SetLastError(ERROR_INVALID_PARAMETER); > - return FALSE; > - } > + lpFileNameW = Basep8BitStringToStaticUnicodeString(lpFileName); > + if (!lpFileNameW) > + { > + return FALSE; > + } > > - if (!(FileNameW = FilenameA2W(lpFileName, FALSE))) > - return FALSE; > + if (!lpExistingFileName) > + { > + SetLastError(ERROR_INVALID_PARAMETER); > + return FALSE; > + } > > - if (!(ExistingFileNameW = FilenameA2W(lpExistingFileName, TRUE))) > - return FALSE; > + if (!Basep8BitStringToDynamicUnicodeString(&ExistingFileNameW, > lpExistingFileName)) > + { > + return FALSE; > + } > > - Ret = CreateHardLinkW(FileNameW , ExistingFileNameW , > lpSecurityAttributes); > + Ret = CreateHardLinkW(lpFileNameW->Buffer, ExistingFileNameW.Buffer, > lpSecurityAttributes); > > - RtlFreeHeap(RtlGetProcessHeap(), 0, ExistingFileNameW); > + RtlFreeHeap(RtlGetProcessHeap(), 0, ExistingFileNameW.Buffer); > > - return Ret; > + return Ret; > } > > /* EOF */ > > >
_______________________________________________ Ros-dev mailing list Ros-dev@reactos.org http://www.reactos.org/mailman/listinfo/ros-dev