Implement OpenAndMapFileForRead, RetreiveFileSecurity, StampFileSecurity, TakeOwnershipOfFile and UnmapAndCloseFile. Modified: trunk/reactos/include/wine/setupapi.h Modified: trunk/reactos/lib/setupapi/misc.c Modified: trunk/reactos/lib/setupapi/setupapi.spec _____
Modified: trunk/reactos/include/wine/setupapi.h --- trunk/reactos/include/wine/setupapi.h 2005-05-05 16:15:08 UTC (rev 15006) +++ trunk/reactos/include/wine/setupapi.h 2005-05-05 16:16:28 UTC (rev 15007) @@ -681,7 +681,9 @@
VOID WINAPI MyFree(PVOID lpMem); PVOID WINAPI MyMalloc(DWORD dwSize); PVOID WINAPI MyRealloc(PVOID lpSrc, DWORD dwSize); +DWORD WINAPI OpenAndMapForRead(PCWSTR, PDWORD, PHANDLE, PHANDLE, PVOID *); LONG WINAPI QueryRegistryValue(HKEY, PCWSTR, PBYTE *, PDWORD, PDWORD); +DWORD WINAPI RetreiveFileSecurity(PCWSTR, PSECURITY_DESCRIPTOR *); BOOL WINAPI SetupCloseFileQueue( HSPFILEQ ); void WINAPI SetupCloseInfFile( HINF hinf ); BOOL WINAPI SetupCommitFileQueueA( HWND, HSPFILEQ, PSP_FILE_CALLBACK_A, PVOID ); @@ -820,8 +822,12 @@ #define SetupSetFileQueueAlternatePlatform WINELIB_NAME_AW(SetupSetFileQueueAlternatePlatform) BOOL WINAPI SetupSetFileQueueFlags( HSPFILEQ, DWORD, DWORD ); void WINAPI SetupTermDefaultQueueCallback( PVOID ); +DWORD WINAPI StampFileSecurity(PCWSTR, PSECURITY_DESCRIPTOR); +DWORD WINAPI TakeOwnershipOfFile(PCWSTR); PSTR WINAPI UnicodeToMultiByte(PCWSTR lpUnicodeStr, UINT uCodePage); +BOOL WINAPI UnmapAndCloseFile(HANDLE, HANDLE, PVOID);
+ #undef DECL_WINELIB_SETUPAPI_TYPE_AW
#endif /* _INC_SETUPAPI */ _____
Modified: trunk/reactos/lib/setupapi/misc.c --- trunk/reactos/lib/setupapi/misc.c 2005-05-05 16:15:08 UTC (rev 15006) +++ trunk/reactos/lib/setupapi/misc.c 2005-05-05 16:16:28 UTC (rev 15007) @@ -549,12 +549,12 @@
*/ DWORD WINAPI CaptureStringArg(LPCWSTR pSrc, LPWSTR *pDst) { - if (pDst == NULL) - return ERROR_INVALID_PARAMETER; + if (pDst == NULL) + return ERROR_INVALID_PARAMETER;
- *pDst = DuplicateString(pSrc); + *pDst = DuplicateString(pSrc);
- return ERROR_SUCCESS; + return ERROR_SUCCESS; }
@@ -576,10 +576,265 @@ */ DWORD WINAPI CaptureAndConvertAnsiArg(LPCSTR pSrc, LPWSTR *pDst) { - if (pDst == NULL) - return ERROR_INVALID_PARAMETER; + if (pDst == NULL) + return ERROR_INVALID_PARAMETER;
- *pDst = MultiByteToUnicode(pSrc, CP_ACP); + *pDst = MultiByteToUnicode(pSrc, CP_ACP);
- return ERROR_SUCCESS; + return ERROR_SUCCESS; } + + +/********************************************************************** **** + * OpenAndMapFileForRead [SETUPAPI.@] + * + * Open and map a file to a buffer. + * + * PARAMS + * lpFileName [I] Name of the file to be opened + * lpSize [O] Pointer to the file size + * lpFile [0] Pointer to the file handle + * lpMapping [0] Pointer to the mapping handle + * lpBuffer [0] Pointer to the file buffer + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: Other + * + * NOTE + * Call UnmapAndCloseFile to release the file. + */ +DWORD WINAPI OpenAndMapFileForRead(LPCWSTR lpFileName, + LPDWORD lpSize, + LPHANDLE lpFile, + LPHANDLE lpMapping, + LPVOID *lpBuffer) +{ + DWORD dwError; + + TRACE("%s %p %p %p %p\n", + debugstr_w(lpFileName), lpSize, lpFile, lpMapping, lpBuffer); + + *lpFile = CreateFileW(lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, 0, NULL); + if (*lpFile == INVALID_HANDLE_VALUE) + return GetLastError(); + + *lpSize = GetFileSize(*lpFile, NULL); + if (*lpSize == INVALID_FILE_SIZE) + { + dwError = GetLastError(); + CloseHandle(*lpFile); + return dwError; + } + + *lpMapping = CreateFileMappingW(*lpFile, NULL, PAGE_READONLY, 0, + *lpSize, NULL); + if (*lpMapping == NULL) + { + dwError = GetLastError(); + CloseHandle(*lpFile); + return dwError; + } + + *lpBuffer = MapViewOfFile(*lpMapping, FILE_MAP_READ, 0, 0, *lpSize); + if (*lpBuffer == NULL) + { + dwError = GetLastError(); + CloseHandle(*lpMapping); + CloseHandle(*lpFile); + return dwError; + } + + return ERROR_SUCCESS; +} + + +/********************************************************************** **** + * UnmapAndCloseFile [SETUPAPI.@] + * + * Unmap and close a mapped file. + * + * PARAMS + * hFile [I] Handle to the file + * hMapping [I] Handle to the file mapping + * lpBuffer [I] Pointer to the file buffer + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL WINAPI UnmapAndCloseFile(HANDLE hFile, HANDLE hMapping, LPVOID lpBuffer) +{ + TRACE("%x %x %p\n", + hFile, hMapping, lpBuffer); + + if (!UnmapViewOfFile(lpBuffer)) + return FALSE; + + if (!CloseHandle(hMapping)) + return FALSE; + + if (!CloseHandle(hFile)) + return FALSE; + + return TRUE; +} + + +/********************************************************************** **** + * StampFileSecurity [SETUPAPI.@] + * + * Assign a new security descriptor to the given file. + * + * PARAMS + * lpFileName [I] Name of the file + * pSecurityDescriptor [I] New security descriptor + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: other + */ +DWORD WINAPI StampFileSecurity(LPCWSTR lpFileName, PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + TRACE("%s %p\n", debugstr_w(lpFileName), pSecurityDescriptor); + + if (!SetFileSecurityW(lpFileName, OWNER_SECURITY_INFORMATION | + GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, + pSecurityDescriptor)) + return GetLastError(); + + return ERROR_SUCCESS; +} + + +/********************************************************************** **** + * TakeOwnershipOfFile [SETUPAPI.@] + * + * Takes the ownership of the given file. + * + * PARAMS + * lpFileName [I] Name of the file + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: other + */ +DWORD WINAPI TakeOwnershipOfFile(LPCWSTR lpFileName) +{ + SECURITY_DESCRIPTOR SecDesc; + HANDLE hToken = NULL; + PTOKEN_OWNER pOwner = NULL; + DWORD dwError; + DWORD dwSize; + + TRACE("%s\n", debugstr_w(lpFileName)); + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) + return GetLastError(); + + if (!GetTokenInformation(hToken, TokenOwner, NULL, 0, &dwSize)) + { + goto fail; + } + + pOwner = (PTOKEN_OWNER)MyMalloc(dwSize); + if (pOwner == NULL) + { + CloseHandle(hToken); + return ERROR_NOT_ENOUGH_MEMORY; + } + + if (!GetTokenInformation(hToken, TokenOwner, pOwner, dwSize, &dwSize)) + { + goto fail; + } + + if (!InitializeSecurityDescriptor(&SecDesc, SECURITY_DESCRIPTOR_REVISION)) + { + goto fail; + } + + if (!SetSecurityDescriptorOwner(&SecDesc, pOwner->Owner, FALSE)) + { + goto fail; + } + + if (!SetFileSecurityW(lpFileName, OWNER_SECURITY_INFORMATION, &SecDesc)) + { + goto fail; + } + + MyFree(pOwner); + CloseHandle(hToken); + + return ERROR_SUCCESS; + +fail:; + dwError = GetLastError(); + + if (pOwner != NULL) + MyFree(pOwner); + + if (hToken != NULL) + CloseHandle(hToken); + + return dwError; +} + + +/********************************************************************** **** + * RetreiveFileSecurity [SETUPAPI.@] + * + * Retrieve the security descriptor that is associated with the given file. + * + * PARAMS + * lpFileName [I] Name of the file + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: other + */ +DWORD WINAPI RetreiveFileSecurity(LPCWSTR lpFileName, + PSECURITY_DESCRIPTOR *pSecurityDescriptor) +{ + PSECURITY_DESCRIPTOR SecDesc; + DWORD dwSize = 0x100; + DWORD dwError; + + SecDesc = (PSECURITY_DESCRIPTOR)MyMalloc(dwSize); + if (SecDesc == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + if (GetFileSecurityW(lpFileName, OWNER_SECURITY_INFORMATION | + GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, + SecDesc, dwSize, &dwSize)) + { + *pSecurityDescriptor = SecDesc; + return ERROR_SUCCESS; + } + + dwError = GetLastError(); + if (dwError != ERROR_INSUFFICIENT_BUFFER) + { + MyFree(SecDesc); + return dwError; + } + + SecDesc = (PSECURITY_DESCRIPTOR)MyRealloc(SecDesc, dwSize); + if (SecDesc == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + if (GetFileSecurityW(lpFileName, OWNER_SECURITY_INFORMATION | + GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, + SecDesc, dwSize, &dwSize)) + { + *pSecurityDescriptor = SecDesc; + return ERROR_SUCCESS; + } + + dwError = GetLastError(); + MyFree(SecDesc); + + return dwError; +} _____
Modified: trunk/reactos/lib/setupapi/setupapi.spec --- trunk/reactos/lib/setupapi/setupapi.spec 2005-05-05 16:15:08 UTC (rev 15006) +++ trunk/reactos/lib/setupapi/setupapi.spec 2005-05-05 16:16:28 UTC (rev 15007) @@ -223,13 +223,13 @@
@ stub MyGetFileTitle @ stdcall MyMalloc(long) @ stdcall MyRealloc(ptr long) -@ stub OpenAndMapFileForRead +@ stdcall OpenAndMapFileForRead(wstr ptr ptr ptr ptr) @ stub OutOfMemory @ stub QueryMultiSzValueToArray @ stdcall QueryRegistryValue(long wstr ptr ptr ptr) @ stub ReadAsciiOrUnicodeTextFile @ stub RegistryDelnode -@ stub RetreiveFileSecurity +@ stdcall RetreiveFileSecurity(wstr ptr) @ stub RetrieveServiceConfig @ stub SearchForInfFile @ stub SetArrayToMultiSzValue @@ -512,7 +512,7 @@ @ stdcall SetupTermDefaultQueueCallback(ptr) @ stdcall SetupTerminateFileLog(long) @ stub ShouldDeviceBeExcluded -@ stub StampFileSecurity +@ stdcall StampFileSecurity(wstr ptr) @ stub StringTableAddString @ stub StringTableAddStringEx @ stub StringTableDestroy @@ -526,9 +526,9 @@ @ stub StringTableSetExtraData @ stub StringTableStringFromId @ stub StringTableTrim -@ stub TakeOwnershipOfFile +@ stdcall TakeOwnershipOfFile(wstr) @ stdcall UnicodeToMultiByte(wstr long) -@ stub UnmapAndCloseFile +@ stdcall UnmapAndCloseFile(long long ptr) @ stub VerifyCatalogFile @ stub VerifyFile @ stub pSetupAccessRunOnceNodeList