Owen Rudge : imagehlp: Implement ImageRemoveCertificate.
Alexandre Julliard
julliard at winehq.org
Mon Dec 7 10:26:11 CST 2009
Module: wine
Branch: master
Commit: 5bcc37a9fd6564a8d6b85ce8af169fced5c6f49d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5bcc37a9fd6564a8d6b85ce8af169fced5c6f49d
Author: Owen Rudge <orudge at codeweavers.com>
Date: Fri Dec 4 10:11:57 2009 -0600
imagehlp: Implement ImageRemoveCertificate.
---
dlls/imagehlp/integrity.c | 80 +++++++++++++++++++++++++++++++++++++-
dlls/imagehlp/tests/integrity.c | 4 +-
2 files changed, 79 insertions(+), 5 deletions(-)
diff --git a/dlls/imagehlp/integrity.c b/dlls/imagehlp/integrity.c
index 6a13c53..3aaac7d 100644
--- a/dlls/imagehlp/integrity.c
+++ b/dlls/imagehlp/integrity.c
@@ -564,7 +564,81 @@ BOOL WINAPI ImageGetDigestStream(
*/
BOOL WINAPI ImageRemoveCertificate(HANDLE FileHandle, DWORD Index)
{
- FIXME("(%p, %d): stub\n", FileHandle, Index);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ DWORD size = 0, count = 0, sd_VirtualAddr = 0, offset = 0;
+ DWORD data_size = 0, cert_size = 0, cert_size_padded = 0, ret = 0;
+ LPVOID cert_data;
+ BOOL r;
+
+ TRACE("(%p, %d)\n", FileHandle, Index);
+
+ r = ImageEnumerateCertificates(FileHandle, CERT_SECTION_TYPE_ANY, &count, NULL, 0);
+
+ if ((!r) || (count == 0))
+ return FALSE;
+
+ if ((!IMAGEHLP_GetSecurityDirOffset(FileHandle, &sd_VirtualAddr, &size)) ||
+ (!IMAGEHLP_GetCertificateOffset(FileHandle, Index, &offset, &cert_size)))
+ return FALSE;
+
+ /* Ignore any padding we have, too */
+ if (cert_size % 8)
+ cert_size_padded = cert_size + (8 - (cert_size % 8));
+ else
+ cert_size_padded = cert_size;
+
+ data_size = size - (offset - sd_VirtualAddr) - cert_size_padded;
+
+ if (data_size == 0)
+ {
+ ret = SetFilePointer(FileHandle, sd_VirtualAddr, NULL, FILE_BEGIN);
+
+ if (ret == INVALID_SET_FILE_POINTER)
+ return FALSE;
+ }
+ else
+ {
+ cert_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, data_size);
+
+ if (!cert_data)
+ return FALSE;
+
+ ret = SetFilePointer(FileHandle, offset + cert_size_padded, NULL, FILE_BEGIN);
+
+ if (ret == INVALID_SET_FILE_POINTER)
+ goto error;
+
+ /* Read any subsequent certificates */
+ r = ReadFile(FileHandle, cert_data, data_size, &count, NULL);
+
+ if ((!r) || (count != data_size))
+ goto error;
+
+ SetFilePointer(FileHandle, offset, NULL, FILE_BEGIN);
+
+ /* Write them one index back */
+ r = WriteFile(FileHandle, cert_data, data_size, &count, NULL);
+
+ if ((!r) || (count != data_size))
+ goto error;
+
+ HeapFree(GetProcessHeap(), 0, cert_data);
+ }
+
+ /* If security directory is at end of file, trim the file */
+ if (GetFileSize(FileHandle, NULL) == sd_VirtualAddr + size)
+ SetEndOfFile(FileHandle);
+
+ if (count == 1)
+ r = IMAGEHLP_SetSecurityDirOffset(FileHandle, 0, 0);
+ else
+ r = IMAGEHLP_SetSecurityDirOffset(FileHandle, sd_VirtualAddr, size - cert_size_padded);
+
+ if (!r)
+ return FALSE;
+
+ return TRUE;
+
+error:
+ HeapFree(GetProcessHeap(), 0, cert_data);
+ return FALSE;
}
diff --git a/dlls/imagehlp/tests/integrity.c b/dlls/imagehlp/tests/integrity.c
index e89167c..718ca3e 100644
--- a/dlls/imagehlp/tests/integrity.c
+++ b/dlls/imagehlp/tests/integrity.c
@@ -201,10 +201,10 @@ static void test_remove_certificate(void)
return;
}
- todo_wine ok (pImageRemoveCertificate(hFile, 0), "Unable to remove certificate from file; err=%x\n", GetLastError());
+ ok (pImageRemoveCertificate(hFile, 0), "Unable to remove certificate from file; err=%x\n", GetLastError());
/* Test to see if the certificate has actually been removed */
- todo_wine ok(pImageGetCertificateHeader(hFile, 0, &cert) == FALSE, "Certificate header retrieval succeeded when it should have failed\n");
+ ok(pImageGetCertificateHeader(hFile, 0, &cert) == FALSE, "Certificate header retrieval succeeded when it should have failed\n");
CloseHandle(hFile);
}
More information about the wine-cvs
mailing list