Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenvista.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
1.7.6.1
|