ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

vista.c
Go to the documentation of this file.
00001 /* COPYRIGHT:       See COPYING in the top level directory
00002  * PROJECT:         ReactOS system libraries
00003  * PURPOSE:         Vista functions
00004  * PROGRAMMER:      Thomas Weidenmueller <w3seek@reactos.com>
00005  */
00006 
00007 #include <k32.h>
00008 
00009 #define NDEBUG
00010 #include <debug.h>
00011 
00012 #if _WIN32_WINNT >= 0x600
00013 
00014 /* FIXME: Move these RTL declarations to the NDK */
00015 NTSTATUS
00016 NTAPI
00017 RtlSleepConditionVariableCS(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable,
00018                             IN OUT PRTL_CRITICAL_SECTION CriticalSection,
00019                             IN PLARGE_INTEGER TimeOut  OPTIONAL);
00020 
00021 NTSTATUS
00022 NTAPI
00023 RtlSleepConditionVariableSRW(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable,
00024                              IN OUT PRTL_SRWLOCK SRWLock,
00025                              IN PLARGE_INTEGER TimeOut  OPTIONAL,
00026                              IN ULONG Flags);
00027 
00028 /* PUBLIC FUNCTIONS ***********************************************************/
00029 
00030 /*
00031  * @implemented
00032  */
00033 BOOL
00034 WINAPI
00035 SleepConditionVariableCS(IN OUT PCONDITION_VARIABLE ConditionVariable,
00036                          IN OUT PCRITICAL_SECTION CriticalSection,
00037                          IN DWORD dwMilliseconds)
00038 {
00039     NTSTATUS Status = 0;
00040     LARGE_INTEGER TimeOut;
00041     PLARGE_INTEGER TimeOutPtr = NULL;
00042 
00043     if (dwMilliseconds != INFINITE)
00044     {
00045         TimeOut.QuadPart = UInt32x32To64(-10000, dwMilliseconds);
00046         TimeOutPtr = &TimeOut;
00047     }
00048 
00049 #if 0
00050     Status = RtlSleepConditionVariableCS((PRTL_CONDITION_VARIABLE)ConditionVariable,
00051                                          (PRTL_CRITICAL_SECTION)CriticalSection,
00052                                          TimeOutPtr);
00053 #endif
00054     if (!NT_SUCCESS(Status))
00055     {
00056         BaseSetLastNTError(Status);
00057         return FALSE;
00058     }
00059 
00060     return TRUE;
00061 }
00062 
00063 
00064 /*
00065  * @implemented
00066  */
00067 BOOL
00068 WINAPI
00069 SleepConditionVariableSRW(IN OUT PCONDITION_VARIABLE ConditionVariable,
00070                           IN OUT PSRWLOCK SRWLock,
00071                           IN DWORD dwMilliseconds,
00072                           IN ULONG Flags)
00073 {
00074     NTSTATUS Status = 0;
00075     LARGE_INTEGER TimeOut;
00076     PLARGE_INTEGER TimeOutPtr = NULL;
00077 
00078     if (dwMilliseconds != INFINITE)
00079     {
00080         TimeOut.QuadPart = UInt32x32To64(-10000, dwMilliseconds);
00081         TimeOutPtr = &TimeOut;
00082     }
00083 
00084 #if 0
00085     Status = RtlSleepConditionVariableSRW((PRTL_CONDITION_VARIABLE)ConditionVariable,
00086                                           (PRTL_SRWLOCK)SRWLock,
00087                                           TimeOutPtr,
00088                                           Flags);
00089 #endif
00090     if (!NT_SUCCESS(Status))
00091     {
00092         BaseSetLastNTError(Status);
00093         return FALSE;
00094     }
00095 
00096     return TRUE;
00097 }
00098 
00099 
00100 /*
00101  * @implemented
00102  */
00103 BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection,
00104                                        IN DWORD dwSpinCount,
00105                                        IN DWORD flags )
00106 {
00107     NTSTATUS Status;
00108 
00109     /* FIXME: Flags ignored */
00110 
00111     /* Initialize the critical section */
00112     Status = RtlInitializeCriticalSectionAndSpinCount(
00113         (PRTL_CRITICAL_SECTION)lpCriticalSection,
00114         dwSpinCount);
00115     if (!NT_SUCCESS(Status))
00116     {
00117         /* Set failure code */
00118         BaseSetLastNTError(Status);
00119         return FALSE;
00120     }
00121 
00122     /* Success */
00123     return TRUE;
00124 }
00125 
00126 
00127 
00128 /*
00129  * @implemented
00130  */
00131 BOOL
00132 WINAPI
00133 QueryFullProcessImageNameW(HANDLE hProcess,
00134                            DWORD dwFlags,
00135                            LPWSTR lpExeName,
00136                            PDWORD pdwSize)
00137 {
00138     BYTE Buffer[sizeof(UNICODE_STRING) + MAX_PATH * sizeof(WCHAR)];
00139     UNICODE_STRING *DynamicBuffer = NULL;
00140     UNICODE_STRING *Result = NULL;
00141     NTSTATUS Status;
00142     DWORD Needed;
00143 
00144     Status = NtQueryInformationProcess(hProcess,
00145                                        ProcessImageFileName,
00146                                        Buffer,
00147                                        sizeof(Buffer) - sizeof(WCHAR),
00148                                        &Needed);
00149     if (Status == STATUS_INFO_LENGTH_MISMATCH)
00150     {
00151         DynamicBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Needed + sizeof(WCHAR));
00152         if (!DynamicBuffer)
00153         {
00154             BaseSetLastNTError(STATUS_NO_MEMORY);
00155             return FALSE;
00156         }
00157 
00158         Status = NtQueryInformationProcess(hProcess,
00159                                            ProcessImageFileName,
00160                                            (LPBYTE)DynamicBuffer,
00161                                            Needed,
00162                                            &Needed);
00163         Result = DynamicBuffer;
00164     }
00165     else Result = (PUNICODE_STRING)Buffer;
00166 
00167     if (!NT_SUCCESS(Status)) goto Cleanup;
00168 
00169     if (Result->Length / sizeof(WCHAR) + 1 > *pdwSize)
00170     {
00171         Status = STATUS_BUFFER_TOO_SMALL;
00172         goto Cleanup;
00173     }
00174 
00175     *pdwSize = Result->Length / sizeof(WCHAR);
00176     memcpy(lpExeName, Result->Buffer, Result->Length);
00177     lpExeName[*pdwSize] = 0;
00178 
00179 Cleanup:
00180     RtlFreeHeap(RtlGetProcessHeap(), 0, DynamicBuffer);
00181 
00182     if (!NT_SUCCESS(Status))
00183     {
00184         BaseSetLastNTError(Status);
00185     }
00186 
00187     return !Status;
00188 }
00189 
00190 
00191 /*
00192  * @implemented
00193  */
00194 BOOL
00195 WINAPI
00196 QueryFullProcessImageNameA(HANDLE hProcess,
00197                            DWORD dwFlags,
00198                            LPSTR lpExeName,
00199                            PDWORD pdwSize)
00200 {
00201     DWORD pdwSizeW = *pdwSize;
00202     BOOL Result;
00203     LPWSTR lpExeNameW;
00204 
00205     lpExeNameW = RtlAllocateHeap(RtlGetProcessHeap(),
00206                                  HEAP_ZERO_MEMORY,
00207                                  *pdwSize * sizeof(WCHAR));
00208     if (!lpExeNameW)
00209     {
00210         BaseSetLastNTError(STATUS_NO_MEMORY);
00211         return FALSE;
00212     }
00213 
00214     Result = QueryFullProcessImageNameW(hProcess, dwFlags, lpExeNameW, &pdwSizeW);
00215 
00216     if (Result)
00217         Result = (0 != WideCharToMultiByte(CP_ACP, 0,
00218                                            lpExeNameW,
00219                                            -1,
00220                                            lpExeName,
00221                                            *pdwSize,
00222                                            NULL, NULL));
00223 
00224     if (Result)
00225         *pdwSize = strlen(lpExeName);
00226 
00227     RtlFreeHeap(RtlGetProcessHeap(), 0, lpExeNameW);
00228     return Result;
00229 }
00230 
00231 /*
00232  * @unimplemented
00233  */
00234 HRESULT
00235 WINAPI
00236 GetApplicationRecoveryCallback(IN HANDLE hProcess,
00237                                OUT APPLICATION_RECOVERY_CALLBACK* pRecoveryCallback,
00238                                OUT PVOID* ppvParameter,
00239                                PDWORD dwPingInterval,
00240                                PDWORD dwFlags)
00241 {
00242     UNIMPLEMENTED;
00243     return E_FAIL;
00244 }
00245 
00246 
00247 /*
00248  * @unimplemented
00249  */
00250 HRESULT
00251 WINAPI
00252 GetApplicationRestart(IN HANDLE hProcess,
00253                       OUT PWSTR pwzCommandline  OPTIONAL,
00254                       IN OUT PDWORD pcchSize,
00255                       OUT PDWORD pdwFlags  OPTIONAL)
00256 {
00257     UNIMPLEMENTED;
00258     return E_FAIL;
00259 }
00260 
00261 
00262 /*
00263  * @unimplemented
00264  */
00265 VOID
00266 WINAPI
00267 RecoveryFinished(IN BOOL bSuccess)
00268 {
00269     UNIMPLEMENTED;
00270 }
00271 
00272 
00273 /*
00274  * @unimplemented
00275  */
00276 HRESULT
00277 WINAPI
00278 RecoveryInProgress(OUT PBOOL pbCancelled)
00279 {
00280     UNIMPLEMENTED;
00281     return E_FAIL;
00282 }
00283 
00284 
00285 /*
00286  * @unimplemented
00287  */
00288 HRESULT
00289 WINAPI
00290 RegisterApplicationRecoveryCallback(IN APPLICATION_RECOVERY_CALLBACK pRecoveyCallback,
00291                                     IN PVOID pvParameter  OPTIONAL,
00292                                     DWORD dwPingInterval,
00293                                     DWORD dwFlags)
00294 {
00295     UNIMPLEMENTED;
00296     return E_FAIL;
00297 }
00298 
00299 
00300 /*
00301  * @unimplemented
00302  */
00303 HRESULT
00304 WINAPI
00305 RegisterApplicationRestart(IN PCWSTR pwzCommandline  OPTIONAL,
00306                            IN DWORD dwFlags)
00307 {
00308     UNIMPLEMENTED;
00309     return E_FAIL;
00310 }
00311 
00312 /*--------------------------------------------------------------
00313  *  GetConsoleHistoryInfo
00314  *
00315  * @implemented
00316  */
00317 BOOL
00318 WINAPI
00319 GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
00320 {
00321     CSR_API_MESSAGE Request;
00322     ULONG CsrRequest = MAKE_CSR_API(GET_HISTORY_INFO, CSR_CONSOLE);
00323     NTSTATUS Status;
00324     if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
00325     {
00326         SetLastError(ERROR_INVALID_PARAMETER);
00327         return FALSE;
00328     }
00329     Status = CsrClientCallServer(&Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
00330     if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
00331     {
00332         BaseSetLastNTError(Status);
00333         return FALSE;
00334     }
00335     lpConsoleHistoryInfo->HistoryBufferSize      = Request.Data.GetHistoryInfo.HistoryBufferSize;
00336     lpConsoleHistoryInfo->NumberOfHistoryBuffers = Request.Data.GetHistoryInfo.NumberOfHistoryBuffers;
00337     lpConsoleHistoryInfo->dwFlags                = Request.Data.GetHistoryInfo.dwFlags;
00338     return TRUE;
00339 }
00340 
00341 
00342 /*--------------------------------------------------------------
00343  *  SetConsoleHistoryInfo
00344  *
00345  * @implemented
00346  */
00347 BOOL
00348 WINAPI
00349 SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
00350 {
00351     CSR_API_MESSAGE Request;
00352     ULONG CsrRequest = MAKE_CSR_API(GET_HISTORY_INFO, CSR_CONSOLE);
00353     NTSTATUS Status;
00354     if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
00355     {
00356         SetLastError(ERROR_INVALID_PARAMETER);
00357         return FALSE;
00358     }
00359     Request.Data.SetHistoryInfo.HistoryBufferSize      = lpConsoleHistoryInfo->HistoryBufferSize;
00360     Request.Data.SetHistoryInfo.NumberOfHistoryBuffers = lpConsoleHistoryInfo->NumberOfHistoryBuffers;
00361     Request.Data.SetHistoryInfo.dwFlags                = lpConsoleHistoryInfo->dwFlags;
00362     Status = CsrClientCallServer(&Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
00363     if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
00364     {
00365         BaseSetLastNTError(Status);
00366         return FALSE;
00367     }
00368     return TRUE;
00369 }
00370 
00371 
00372 /*--------------------------------------------------------------
00373  *  GetConsoleOriginalTitleW
00374  *
00375  * @unimplemented
00376  */
00377 DWORD
00378 WINAPI
00379 GetConsoleOriginalTitleW(OUT LPWSTR lpConsoleTitle,
00380                          IN DWORD nSize)
00381 {
00382     DPRINT1("GetConsoleOriginalTitleW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle, nSize);
00383     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00384     return 0;
00385 }
00386 
00387 
00388 /*--------------------------------------------------------------
00389  *  GetConsoleOriginalTitleA
00390  *
00391  * @unimplemented
00392  */
00393 DWORD
00394 WINAPI
00395 GetConsoleOriginalTitleA(OUT LPSTR lpConsoleTitle,
00396                          IN DWORD nSize)
00397 {
00398     DPRINT1("GetConsoleOriginalTitleA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpConsoleTitle, nSize);
00399     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00400     return 0;
00401 }
00402 
00403 
00404 /*--------------------------------------------------------------
00405  *  GetConsoleScreenBufferInfoEx
00406  *
00407  * @unimplemented
00408  */
00409 BOOL
00410 WINAPI
00411 GetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput,
00412                              OUT PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx)
00413 {
00414     DPRINT1("GetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput, lpConsoleScreenBufferInfoEx);
00415     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00416     return FALSE;
00417 }
00418 
00419 
00420 /*--------------------------------------------------------------
00421  *  SetConsoleScreenBufferInfoEx
00422  *
00423  * @unimplemented
00424  */
00425 BOOL
00426 WINAPI
00427 SetConsoleScreenBufferInfoEx(IN HANDLE hConsoleOutput,
00428                              IN PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx)
00429 {
00430     DPRINT1("SetConsoleScreenBufferInfoEx(0x%p, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput, lpConsoleScreenBufferInfoEx);
00431     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00432     return FALSE;
00433 }
00434 
00435 
00436 /*--------------------------------------------------------------
00437  *  GetCurrentConsoleFontEx
00438  *
00439  * @unimplemented
00440  */
00441 BOOL
00442 WINAPI
00443 GetCurrentConsoleFontEx(IN HANDLE hConsoleOutput,
00444                         IN BOOL bMaximumWindow,
00445                         OUT PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx)
00446 {
00447     DPRINT1("GetCurrentConsoleFontEx(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", hConsoleOutput, bMaximumWindow, lpConsoleCurrentFontEx);
00448     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00449     return FALSE;
00450 }
00451 
00452 
00453 /*
00454  * @implemented
00455  */
00456 BOOLEAN
00457 WINAPI
00458 CreateSymbolicLinkW(IN LPCWSTR lpSymlinkFileName,
00459                     IN LPCWSTR lpTargetFileName,
00460                     IN DWORD dwFlags)
00461 {
00462     IO_STATUS_BLOCK IoStatusBlock;
00463     OBJECT_ATTRIBUTES ObjectAttributes;
00464     HANDLE hSymlink = NULL;
00465     UNICODE_STRING SymlinkFileName = { 0, 0, NULL };
00466     UNICODE_STRING TargetFileName = { 0, 0, NULL };
00467     BOOLEAN bAllocatedTarget = FALSE, bRelativePath = FALSE;
00468     LPWSTR lpTargetFullFileName = NULL;
00469     SIZE_T cbPrintName;
00470     SIZE_T cbReparseData;
00471     PREPARSE_DATA_BUFFER pReparseData = NULL;
00472     PBYTE pBufTail;
00473     NTSTATUS Status;
00474     ULONG dwCreateOptions;
00475     DWORD dwErr;
00476 
00477     if(!lpSymlinkFileName || !lpTargetFileName || (dwFlags | SYMBOLIC_LINK_FLAG_DIRECTORY) != SYMBOLIC_LINK_FLAG_DIRECTORY)
00478     {
00479         SetLastError(ERROR_INVALID_PARAMETER);
00480         return FALSE;
00481     }
00482 
00483     if(dwFlags & SYMBOLIC_LINK_FLAG_DIRECTORY)
00484         dwCreateOptions = FILE_DIRECTORY_FILE;
00485     else
00486         dwCreateOptions = FILE_NON_DIRECTORY_FILE;
00487 
00488     switch(RtlDetermineDosPathNameType_U(lpTargetFileName))
00489     {
00490     case RtlPathTypeUnknown:
00491     case RtlPathTypeRooted:
00492     case RtlPathTypeRelative:
00493         bRelativePath = TRUE;
00494         RtlInitUnicodeString(&TargetFileName, lpTargetFileName);
00495         break;
00496 
00497     case RtlPathTypeDriveRelative:
00498         {
00499             LPWSTR FilePart;
00500             SIZE_T cchTargetFullFileName;
00501 
00502             cchTargetFullFileName = GetFullPathNameW(lpTargetFileName, 0, NULL, &FilePart);
00503 
00504             if(cchTargetFullFileName == 0)
00505             {
00506                 dwErr = GetLastError();
00507                 goto Cleanup;
00508             }
00509 
00510             lpTargetFullFileName = RtlAllocateHeap(RtlGetProcessHeap(), 0, cchTargetFullFileName * sizeof(WCHAR));
00511 
00512             if(lpTargetFullFileName == NULL)
00513             {
00514                 dwErr = ERROR_NOT_ENOUGH_MEMORY;
00515                 goto Cleanup;
00516             }
00517 
00518             if(GetFullPathNameW(lpTargetFileName, cchTargetFullFileName, lpTargetFullFileName, &FilePart) == 0)
00519             {
00520                 dwErr = GetLastError();
00521                 goto Cleanup;
00522             }
00523         }
00524 
00525         lpTargetFileName = lpTargetFullFileName;
00526 
00527         // fallthrough
00528 
00529     case RtlPathTypeUncAbsolute:
00530     case RtlPathTypeDriveAbsolute:
00531     case RtlPathTypeLocalDevice:
00532     case RtlPathTypeRootLocalDevice:
00533     default:
00534         if(!RtlDosPathNameToNtPathName_U(lpTargetFileName, &TargetFileName, NULL, NULL))
00535         {
00536             bAllocatedTarget = TRUE;
00537             dwErr = ERROR_INVALID_PARAMETER;
00538             goto Cleanup;
00539         }
00540     }
00541 
00542     cbPrintName = wcslen(lpTargetFileName) * sizeof(WCHAR);
00543     cbReparseData = FIELD_OFFSET(REPARSE_DATA_BUFFER, SymbolicLinkReparseBuffer.PathBuffer) + TargetFileName.Length + cbPrintName;
00544     pReparseData = RtlAllocateHeap(RtlGetProcessHeap(), 0, cbReparseData);
00545 
00546     if(pReparseData == NULL)
00547     {
00548         dwErr = ERROR_NOT_ENOUGH_MEMORY;
00549         goto Cleanup;
00550     }
00551 
00552     pBufTail = (PBYTE)(pReparseData->SymbolicLinkReparseBuffer.PathBuffer);
00553 
00554     pReparseData->ReparseTag = (ULONG)IO_REPARSE_TAG_SYMLINK;
00555     pReparseData->ReparseDataLength = (USHORT)cbReparseData - REPARSE_DATA_BUFFER_HEADER_SIZE;
00556     pReparseData->Reserved = 0;
00557 
00558     pReparseData->SymbolicLinkReparseBuffer.SubstituteNameOffset = 0;
00559     pReparseData->SymbolicLinkReparseBuffer.SubstituteNameLength = TargetFileName.Length;
00560     pBufTail += pReparseData->SymbolicLinkReparseBuffer.SubstituteNameOffset;
00561     RtlCopyMemory(pBufTail, TargetFileName.Buffer, TargetFileName.Length);
00562 
00563     pReparseData->SymbolicLinkReparseBuffer.PrintNameOffset = pReparseData->SymbolicLinkReparseBuffer.SubstituteNameLength;
00564     pReparseData->SymbolicLinkReparseBuffer.PrintNameLength = (USHORT)cbPrintName;
00565     pBufTail += pReparseData->SymbolicLinkReparseBuffer.PrintNameOffset;
00566     RtlCopyMemory(pBufTail, lpTargetFileName, cbPrintName);
00567 
00568     pReparseData->SymbolicLinkReparseBuffer.Flags = 0;
00569 
00570     if(bRelativePath)
00571         pReparseData->SymbolicLinkReparseBuffer.Flags |= 1; // TODO! give this lone flag a name
00572 
00573     if(!RtlDosPathNameToNtPathName_U(lpSymlinkFileName, &SymlinkFileName, NULL, NULL))
00574     {
00575         dwErr = ERROR_PATH_NOT_FOUND;
00576         goto Cleanup;
00577     }
00578 
00579     InitializeObjectAttributes(&ObjectAttributes, &SymlinkFileName, OBJ_CASE_INSENSITIVE, NULL, NULL);
00580 
00581     Status = NtCreateFile
00582     (
00583         &hSymlink,
00584         FILE_WRITE_ATTRIBUTES | DELETE | SYNCHRONIZE,
00585         &ObjectAttributes,
00586         &IoStatusBlock,
00587         NULL,
00588         FILE_ATTRIBUTE_NORMAL,
00589         0,
00590         FILE_CREATE,
00591         FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_REPARSE_POINT | dwCreateOptions,
00592         NULL,
00593         0
00594     );
00595 
00596     if(!NT_SUCCESS(Status))
00597     {
00598         dwErr = RtlNtStatusToDosError(Status);
00599         goto Cleanup;
00600     }
00601 
00602     Status = NtFsControlFile
00603     (
00604         hSymlink,
00605         NULL,
00606         NULL,
00607         NULL,
00608         &IoStatusBlock,
00609         FSCTL_SET_REPARSE_POINT,
00610         pReparseData,
00611         cbReparseData,
00612         NULL,
00613         0
00614     );
00615 
00616     if(!NT_SUCCESS(Status))
00617     {
00618         FILE_DISPOSITION_INFORMATION DispInfo;
00619         DispInfo.DeleteFile = TRUE;
00620         NtSetInformationFile(hSymlink, &IoStatusBlock, &DispInfo, sizeof(DispInfo), FileDispositionInformation);
00621 
00622         dwErr = RtlNtStatusToDosError(Status);
00623         goto Cleanup;
00624     }
00625 
00626     dwErr = NO_ERROR;
00627 
00628 Cleanup:
00629     if(hSymlink)
00630         NtClose(hSymlink);
00631 
00632     RtlFreeUnicodeString(&SymlinkFileName);
00633     if (bAllocatedTarget)
00634     {
00635         RtlFreeHeap(RtlGetProcessHeap(),
00636                     0,
00637                     TargetFileName.Buffer);
00638     }
00639 
00640     if(lpTargetFullFileName)
00641         RtlFreeHeap(RtlGetProcessHeap(), 0, lpTargetFullFileName);
00642 
00643     if(pReparseData)
00644         RtlFreeHeap(RtlGetProcessHeap(), 0, pReparseData);
00645 
00646     if(dwErr)
00647     {
00648         SetLastError(dwErr);
00649         return FALSE;
00650     }
00651 
00652     return TRUE;
00653 }
00654 
00655 
00656 /*
00657  * @implemented
00658  */
00659 BOOLEAN
00660 NTAPI
00661 CreateSymbolicLinkA(IN LPCSTR lpSymlinkFileName,
00662                     IN LPCSTR lpTargetFileName,
00663                     IN DWORD dwFlags)
00664 {
00665     PWCHAR SymlinkW, TargetW;
00666     BOOLEAN Ret;
00667 
00668     if(!lpSymlinkFileName || !lpTargetFileName)
00669     {
00670         SetLastError(ERROR_INVALID_PARAMETER);
00671         return FALSE;
00672     }
00673 
00674     if (!(SymlinkW = FilenameA2W(lpSymlinkFileName, FALSE)))
00675         return FALSE;
00676 
00677     if (!(TargetW = FilenameA2W(lpTargetFileName, TRUE)))
00678         return FALSE;
00679 
00680     Ret = CreateSymbolicLinkW(SymlinkW,
00681                               TargetW,
00682                               dwFlags);
00683 
00684     RtlFreeHeap(RtlGetProcessHeap(), 0, SymlinkW);
00685     RtlFreeHeap(RtlGetProcessHeap(), 0, TargetW);
00686 
00687     return Ret;
00688 }
00689 
00690 /*
00691  * @unimplemented
00692  */
00693 DWORD
00694 WINAPI
00695 GetFinalPathNameByHandleW(IN HANDLE hFile,
00696                           OUT LPWSTR lpszFilePath,
00697                           IN DWORD cchFilePath,
00698                           IN DWORD dwFlags)
00699 {
00700     if (dwFlags & ~(VOLUME_NAME_DOS | VOLUME_NAME_GUID | VOLUME_NAME_NT |
00701                     VOLUME_NAME_NONE | FILE_NAME_NORMALIZED | FILE_NAME_OPENED))
00702     {
00703         SetLastError(ERROR_INVALID_PARAMETER);
00704         return 0;
00705     }
00706 
00707     UNIMPLEMENTED;
00708     return 0;
00709 }
00710 
00711 /*
00712  * @implemented
00713  */
00714 DWORD
00715 WINAPI
00716 GetFinalPathNameByHandleA(IN HANDLE hFile,
00717                           OUT LPSTR lpszFilePath,
00718                           IN DWORD cchFilePath,
00719                           IN DWORD dwFlags)
00720 {
00721     WCHAR FilePathW[MAX_PATH];
00722     UNICODE_STRING FilePathU;
00723     DWORD PrevLastError;
00724     DWORD Ret = 0;
00725 
00726     if (cchFilePath != 0 &&
00727         cchFilePath > sizeof(FilePathW) / sizeof(FilePathW[0]))
00728     {
00729         FilePathU.Length = 0;
00730         FilePathU.MaximumLength = (USHORT)cchFilePath * sizeof(WCHAR);
00731         FilePathU.Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
00732                                            0,
00733                                            FilePathU.MaximumLength);
00734         if (FilePathU.Buffer == NULL)
00735         {
00736             SetLastError(ERROR_NOT_ENOUGH_MEMORY);
00737             return 0;
00738         }
00739     }
00740     else
00741     {
00742         FilePathU.Length = 0;
00743         FilePathU.MaximumLength = sizeof(FilePathW);
00744         FilePathU.Buffer = FilePathW;
00745     }
00746 
00747     /* save the last error code */
00748     PrevLastError = GetLastError();
00749     SetLastError(ERROR_SUCCESS);
00750 
00751     /* call the unicode version that does all the work */
00752     Ret = GetFinalPathNameByHandleW(hFile,
00753                                     FilePathU.Buffer,
00754                                     cchFilePath,
00755                                     dwFlags);
00756 
00757     if (GetLastError() == ERROR_SUCCESS)
00758     {
00759         /* no error, restore the last error code and convert the string */
00760         SetLastError(PrevLastError);
00761 
00762         Ret = FilenameU2A_FitOrFail(lpszFilePath,
00763                                     cchFilePath,
00764                                     &FilePathU);
00765     }
00766 
00767     /* free allocated memory if necessary */
00768     if (FilePathU.Buffer != FilePathW)
00769     {
00770         RtlFreeHeap(RtlGetProcessHeap(),
00771                     0,
00772                     FilePathU.Buffer);
00773     }
00774 
00775     return Ret;
00776 }
00777 
00778 /*
00779  * @unimplemented
00780  */
00781 BOOL
00782 WINAPI
00783 SetFileBandwidthReservation(IN HANDLE hFile,
00784                             IN DWORD nPeriodMilliseconds,
00785                             IN DWORD nBytesPerPeriod,
00786                             IN BOOL bDiscardable,
00787                             OUT LPDWORD lpTransferSize,
00788                             OUT LPDWORD lpNumOutstandingRequests)
00789 {
00790     UNIMPLEMENTED;
00791     return FALSE;
00792 }
00793 
00794 
00795 /*
00796  * @unimplemented
00797  */
00798 BOOL
00799 WINAPI
00800 GetFileBandwidthReservation(IN HANDLE hFile,
00801                             OUT LPDWORD lpPeriodMilliseconds,
00802                             OUT LPDWORD lpBytesPerPeriod,
00803                             OUT LPBOOL pDiscardable,
00804                             OUT LPDWORD lpTransferSize,
00805                             OUT LPDWORD lpNumOutstandingRequests)
00806 {
00807     UNIMPLEMENTED;
00808     return FALSE;
00809 }
00810 
00811 
00812 /*
00813  * @unimplemented
00814  */
00815 BOOL
00816 WINAPI
00817 SetFileCompletionNotificationModes(IN HANDLE FileHandle,
00818                                    IN UCHAR Flags)
00819 {
00820     if (Flags & ~(FILE_SKIP_COMPLETION_PORT_ON_SUCCESS | FILE_SKIP_SET_EVENT_ON_HANDLE))
00821     {
00822         SetLastError(ERROR_INVALID_PARAMETER);
00823         return FALSE;
00824     }
00825 
00826     UNIMPLEMENTED;
00827     return FALSE;
00828 }
00829 
00830 
00831 /*
00832  * @unimplemented
00833  */
00834 HANDLE
00835 WINAPI
00836 OpenFileById(IN HANDLE hFile,
00837              IN LPFILE_ID_DESCRIPTOR lpFileID,
00838              IN DWORD dwDesiredAccess,
00839              IN DWORD dwShareMode,
00840              IN LPSECURITY_ATTRIBUTES lpSecurityAttributes  OPTIONAL,
00841              IN DWORD dwFlags)
00842 {
00843     UNIMPLEMENTED;
00844     return INVALID_HANDLE_VALUE;
00845 }
00846 
00847 #endif
00848 
00849 /*
00850  * @implemented
00851  */
00852 ULONGLONG
00853 WINAPI
00854 GetTickCount64(VOID)
00855 {
00856     ULARGE_INTEGER TickCount;
00857     
00858     while (TRUE)
00859     {
00860         TickCount.HighPart = (ULONG)SharedUserData->TickCount.High1Time;
00861         TickCount.LowPart = SharedUserData->TickCount.LowPart;
00862 
00863         if (TickCount.HighPart == (ULONG)SharedUserData->TickCount.High2Time) break;
00864 
00865         YieldProcessor();
00866      }
00867      
00868      return (UInt32x32To64(TickCount.LowPart, SharedUserData->TickCountMultiplier) >> 24) +
00869             (UInt32x32To64(TickCount.HighPart, SharedUserData->TickCountMultiplier) << 8);
00870 }

Generated on Mon May 28 2012 04:24:11 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.