Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
January 2018
- 62 participants
- 1108 messages
Re: [PATCH 1/5] wined3d: Enable the multi-threaded command stream by default.
by Henri Verbeet
On 30 January 2018 at 23:53, Alexandre Julliard <julliard(a)winehq.org> wrote:
> This is breaking ddraw here:
>
> ../../../tools/runtest -q -P wine -T ../../.. -M ddraw.dll -p ddraw_test.exe.so ddraw1 && touch ddraw1.ok
> failed to create drawable
> 0036:err:d3d:context_set_gl_context Failed to set pixel format 5 on device context 0x160044.
> failed to create drawable
> 0039:err:d3d:context_create Failed to set pixel format 5 on device context 0x50045.
> X Error of failed request: GLXBadWindow
> Major opcode of failed request: 155 (GLX)
> Minor opcode of failed request: 32 (X_GLXDestroyWindow)
> Serial number of failed request: 1197
> Current serial number in output stream: 1208
> Makefile:226: recipe for target 'ddraw1.ok' failed
>
Oh right, that's bug 40767. I had reverted
c89dc58deb9ba74d8dcd7faf7012203cff0724a0 locally while working on
upstreaming csmt, in the idle hope that it would be fixed by the time
I was done with that, and then promptly forgot about it.
Jan. 30, 2018
[PATCH] kernel32: add QueryProcessCycleTime stub (try 2)
by Austin English
Try 2: remove accidental double pointer (Thanks Nikolay)
Signed-off-by: Austin English <austinenglish(a)gmail.com>
---
.../api-ms-win-core-realtime-l1-1-0.spec | 2 +-
dlls/kernel32/kernel32.spec | 2 +-
dlls/kernel32/time.c | 12 ++++++++++++
dlls/kernelbase/kernelbase.spec | 2 +-
4 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/dlls/api-ms-win-core-realtime-l1-1-0/api-ms-win-core-realtime-l1-1-0.spec b/dlls/api-ms-win-core-realtime-l1-1-0/api-ms-win-core-realtime-l1-1-0.spec
index 9c70db1f6f..0def2d7b3a 100644
--- a/dlls/api-ms-win-core-realtime-l1-1-0/api-ms-win-core-realtime-l1-1-0.spec
+++ b/dlls/api-ms-win-core-realtime-l1-1-0/api-ms-win-core-realtime-l1-1-0.spec
@@ -1,5 +1,5 @@
@ stub QueryIdleProcessorCycleTime
@ stub QueryIdleProcessorCycleTimeEx
-@ stub QueryProcessCycleTime
+@ stdcall QueryProcessCycleTime(long ptr) kernel32.QueryProcessCycleTime
@ stdcall QueryThreadCycleTime(long ptr) kernel32.QueryThreadCycleTime
@ stdcall QueryUnbiasedInterruptTime(ptr) kernel32.QueryUnbiasedInterruptTime
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 2c719d437e..5ce637233a 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -1171,7 +1171,7 @@
@ stdcall QueryPerformanceCounter(ptr)
@ stdcall QueryPerformanceFrequency(ptr)
# @ stub QueryProcessAffinityUpdateMode
-# @ stub QueryProcessCycleTime
+@ stdcall QueryProcessCycleTime(long ptr)
@ stdcall QueryThreadCycleTime(long ptr)
# @ stub QueryThreadProfiling
# @ stub QueryThreadpoolStackInformation
diff --git a/dlls/kernel32/time.c b/dlls/kernel32/time.c
index fbe58118fd..b0b866967c 100644
--- a/dlls/kernel32/time.c
+++ b/dlls/kernel32/time.c
@@ -1408,6 +1408,18 @@ DWORD WINAPI GetDynamicTimeZoneInformation(DYNAMIC_TIME_ZONE_INFORMATION *tzinfo
}
/***********************************************************************
+ * QueryProcessCycleTime (KERNEL32.@)
+ */
+BOOL WINAPI QueryProcessCycleTime(HANDLE process, PULONG64 cycle)
+{
+ static int once;
+ if (!once++)
+ FIXME("(%p,%p): stub!\n", process, cycle);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
+}
+
+/***********************************************************************
* QueryThreadCycleTime (KERNEL32.@)
*/
BOOL WINAPI QueryThreadCycleTime(HANDLE thread, PULONG64 cycle)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index b9eb4fcf87..ca33bfdce7 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -1206,7 +1206,7 @@
@ stdcall QueryPerformanceCounter(ptr) kernel32.QueryPerformanceCounter
@ stdcall QueryPerformanceFrequency(ptr) kernel32.QueryPerformanceFrequency
@ stub QueryProcessAffinityUpdateMode
-# @ stub QueryProcessCycleTime
+@ stdcall QueryProcessCycleTime(long ptr) kernel32.QueryProcessCycleTime
# @ stub QueryProtectedPolicy
@ stub QuerySecurityAccessMask
# @ stub QueryStateAtomValueInfo
--
2.13.6
Jan. 30, 2018
Re: [PATCH 1/5] wined3d: Enable the multi-threaded command stream by default.
by Alexandre Julliard
Henri Verbeet <hverbeet(a)codeweavers.com> writes:
> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
> ---
> dlls/wined3d/wined3d_main.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
This is breaking ddraw here:
../../../tools/runtest -q -P wine -T ../../.. -M ddraw.dll -p ddraw_test.exe.so ddraw1 && touch ddraw1.ok
failed to create drawable
0036:err:d3d:context_set_gl_context Failed to set pixel format 5 on device context 0x160044.
failed to create drawable
0039:err:d3d:context_create Failed to set pixel format 5 on device context 0x50045.
X Error of failed request: GLXBadWindow
Major opcode of failed request: 155 (GLX)
Minor opcode of failed request: 32 (X_GLXDestroyWindow)
Serial number of failed request: 1197
Current serial number in output stream: 1208
Makefile:226: recipe for target 'ddraw1.ok' failed
--
Alexandre Julliard
julliard(a)winehq.org
Jan. 30, 2018
[PATCH 2/2] crypt32/tests: Drop store test workarounds for Windows <= 2000
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
This resolves a Coverity warning.
dlls/crypt32/tests/store.c | 340 +++++++++++++++------------------------------
1 file changed, 111 insertions(+), 229 deletions(-)
diff --git a/dlls/crypt32/tests/store.c b/dlls/crypt32/tests/store.c
index 565495a29c..47cd0b38cd 100644
--- a/dlls/crypt32/tests/store.c
+++ b/dlls/crypt32/tests/store.c
@@ -117,16 +117,6 @@ static const BYTE signedCTLWithCTLInnerContent[] = {
0x8e,0xe7,0x5f,0x76,0x2b,0xd1,0x6a,0x82,0xb3,0x30,0x25,0x61,0xf6,0x25,0x23,
0x57,0x6c,0x0b,0x47,0xb8 };
-static BOOL (WINAPI *pCertControlStore)(HCERTSTORE,DWORD,DWORD,void const*);
-static PCCRL_CONTEXT (WINAPI *pCertEnumCRLsInStore)(HCERTSTORE,PCCRL_CONTEXT);
-static BOOL (WINAPI *pCertEnumSystemStore)(DWORD,void*,void*,PFN_CERT_ENUM_SYSTEM_STORE);
-static BOOL (WINAPI *pCertGetStoreProperty)(HCERTSTORE,DWORD,void*,DWORD*);
-static void (WINAPI *pCertRemoveStoreFromCollection)(HCERTSTORE,HCERTSTORE);
-static BOOL (WINAPI *pCertSetStoreProperty)(HCERTSTORE,DWORD,DWORD,const void*);
-static BOOL (WINAPI *pCertAddCertificateLinkToStore)(HCERTSTORE,PCCERT_CONTEXT,DWORD,PCCERT_CONTEXT*);
-static BOOL (WINAPI *pCertRegisterSystemStore)(const void*,DWORD,void*,void*);
-static BOOL (WINAPI *pCertUnregisterSystemStore)(const void*,DWORD);
-
#define test_store_is_empty(store) _test_store_is_empty(__LINE__,store)
static void _test_store_is_empty(unsigned line, HCERTSTORE store)
{
@@ -891,32 +881,25 @@ static void testCollectionStore(void)
ok(context == NULL, "Unexpected cert\n");
}
- if (!pCertRemoveStoreFromCollection)
- {
- win_skip("CertRemoveStoreFromCollection() is not available\n");
- }
- else
- {
- /* Finally, test removing stores from the collection. No return
- * value, so it's a bit funny to test.
- */
- /* This crashes
- * pCertRemoveStoreFromCollection(NULL, NULL);
- */
- /* This "succeeds," no crash, no last error set */
- SetLastError(0xdeadbeef);
- pCertRemoveStoreFromCollection(store2, collection);
- ok(GetLastError() == 0xdeadbeef,
- "Didn't expect an error to be set: %08x\n", GetLastError());
-
- /* After removing store2, the collection should be empty */
- SetLastError(0xdeadbeef);
- pCertRemoveStoreFromCollection(collection, store2);
- ok(GetLastError() == 0xdeadbeef,
- "Didn't expect an error to be set: %08x\n", GetLastError());
- context = CertEnumCertificatesInStore(collection, NULL);
- ok(!context, "Unexpected cert\n");
- }
+ /* Finally, test removing stores from the collection. No return
+ * value, so it's a bit funny to test.
+ */
+ /* This crashes
+ * CertRemoveStoreFromCollection(NULL, NULL);
+ */
+ /* This "succeeds," no crash, no last error set */
+ SetLastError(0xdeadbeef);
+ CertRemoveStoreFromCollection(store2, collection);
+ ok(GetLastError() == 0xdeadbeef,
+ "Didn't expect an error to be set: %08x\n", GetLastError());
+
+ /* After removing store2, the collection should be empty */
+ SetLastError(0xdeadbeef);
+ CertRemoveStoreFromCollection(collection, store2);
+ ok(GetLastError() == 0xdeadbeef,
+ "Didn't expect an error to be set: %08x\n", GetLastError());
+ context = CertEnumCertificatesInStore(collection, NULL);
+ ok(!context, "Unexpected cert\n");
CertCloseStore(collection, 0);
CertCloseStore(store2, 0);
@@ -944,16 +927,11 @@ static void testCollectionStore(void)
CertCloseStore(store1, 0);
/* Test whether a collection store can be committed */
- if (!pCertControlStore)
- {
- win_skip("CertControlStore() is not available\n");
- return;
- }
collection = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, 0,
CERT_STORE_CREATE_NEW_FLAG, NULL);
SetLastError(0xdeadbeef);
- ret = pCertControlStore(collection, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(collection, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(ret, "CertControlStore failed: %08x\n", GetLastError());
/* Adding a mem store that can't be committed prevents a successful commit.
@@ -962,10 +940,10 @@ static void testCollectionStore(void)
CERT_STORE_CREATE_NEW_FLAG, NULL);
CertAddStoreToCollection(collection, store1, 0, 0);
SetLastError(0xdeadbeef);
- ret = pCertControlStore(collection, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(collection, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED,
"expected ERROR_CALL_NOT_IMPLEMENTED, got %d\n", GetLastError());
- pCertRemoveStoreFromCollection(collection, store1);
+ CertRemoveStoreFromCollection(collection, store1);
CertCloseStore(store1, 0);
/* Test adding a cert to a collection with a file store, committing the
@@ -991,7 +969,7 @@ static void testCollectionStore(void)
bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n",
GetLastError());
- ret = pCertControlStore(collection, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(collection, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(ret, "CertControlStore failed: %d\n", ret);
compareStore(collection, "serialized store with cert",
serializedStoreWithCert, sizeof(serializedStoreWithCert), FALSE);
@@ -1059,13 +1037,6 @@ static void testRegStore(void)
todo_wine ok(store != 0, "CertOpenStore failed: %08x\n", GetLastError());
CertCloseStore(store, 0);
- /* It looks like the remainder pretty much needs CertControlStore() */
- if (!pCertControlStore)
- {
- win_skip("CertControlStore() is not available\n");
- return;
- }
-
rc = RegCreateKeyExA(HKEY_CURRENT_USER, tempKey, 0, NULL, 0, KEY_ALL_ACCESS,
NULL, &key, NULL);
ok(!rc, "RegCreateKeyExA failed: %d\n", rc);
@@ -1089,7 +1060,7 @@ static void testRegStore(void)
ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n",
GetLastError());
/* so flush the cache to force a commit.. */
- ret = pCertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(ret, "CertControlStore failed: %08x\n", GetLastError());
/* and check that the expected subkey was written. */
size = sizeof(hash);
@@ -1148,7 +1119,7 @@ static void testRegStore(void)
ok(context != NULL, "Expected a cert context\n");
if (context)
CertDeleteCertificateFromStore(context);
- ret = pCertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(ret, "CertControlStore failed: %08x\n", GetLastError());
/* Add a serialized cert with a bogus hash directly to the registry */
@@ -1185,7 +1156,7 @@ static void testRegStore(void)
sizeof(buf));
ok(!rc, "RegSetValueExA failed: %d\n", rc);
- ret = pCertControlStore(store, 0, CERT_STORE_CTRL_RESYNC, NULL);
+ ret = CertControlStore(store, 0, CERT_STORE_CTRL_RESYNC, NULL);
ok(ret, "CertControlStore failed: %08x\n", GetLastError());
/* Make sure the bogus hash cert gets loaded. */
@@ -1242,7 +1213,7 @@ static void testRegStore(void)
sizeof(buf));
ok(!rc, "RegSetValueExA failed: %d\n", rc);
- ret = pCertControlStore(store, 0, CERT_STORE_CTRL_RESYNC, NULL);
+ ret = CertControlStore(store, 0, CERT_STORE_CTRL_RESYNC, NULL);
ok(ret, "CertControlStore failed: %08x\n", GetLastError());
/* and make sure just one cert still gets loaded. */
@@ -1253,9 +1224,7 @@ static void testRegStore(void)
if (context)
certCount++;
} while (context != NULL);
- ok(certCount == 1 ||
- broken(certCount == 2) /* NT4 */ ,
- "Expected 1 certificates, got %d\n", certCount);
+ ok(certCount == 1, "Expected 1 certificate, got %d\n", certCount);
/* Try again with the correct hash... */
ptr = buf + sizeof(*hdr);
@@ -1265,7 +1234,7 @@ static void testRegStore(void)
sizeof(buf));
ok(!rc, "RegSetValueExA failed: %d\n", rc);
- ret = pCertControlStore(store, 0, CERT_STORE_CTRL_RESYNC, NULL);
+ ret = CertControlStore(store, 0, CERT_STORE_CTRL_RESYNC, NULL);
ok(ret, "CertControlStore failed: %08x\n", GetLastError());
/* and make sure two certs get loaded. */
@@ -1304,20 +1273,10 @@ static void testRegStore(void)
rc = RegDeleteKeyA(HKEY_CURRENT_USER, tempKey);
if (rc)
{
- HMODULE shlwapi = LoadLibraryA("shlwapi");
-
/* Use shlwapi's SHDeleteKeyA to _really_ blow away the key,
* otherwise subsequent tests will fail.
*/
- if (shlwapi)
- {
- DWORD (WINAPI *pSHDeleteKeyA)(HKEY, LPCSTR);
-
- pSHDeleteKeyA = (void*)GetProcAddress(shlwapi, "SHDeleteKeyA");
- if (pSHDeleteKeyA)
- pSHDeleteKeyA(HKEY_CURRENT_USER, tempKey);
- FreeLibrary(shlwapi);
- }
+ SHDeleteKeyA(HKEY_CURRENT_USER, tempKey);
}
}
}
@@ -1438,7 +1397,6 @@ static void testSystemStore(void)
if (memStore)
{
BOOL ret = CertAddStoreToCollection(store, memStore, 0, 0);
- /* FIXME: this'll fail on NT4, but what error will it give? */
ok(ret, "CertAddStoreToCollection failed: %08x\n", GetLastError());
CertCloseStore(memStore, 0);
}
@@ -1489,12 +1447,6 @@ static void testFileStore(void)
PCCERT_CONTEXT cert;
HANDLE file;
- if (!pCertControlStore)
- {
- win_skip("CertControlStore() is not available\n");
- return;
- }
-
store = CertOpenStore(CERT_STORE_PROV_FILE, 0, 0, 0, NULL);
ok(!store && GetLastError() == ERROR_INVALID_HANDLE,
"Expected ERROR_INVALID_HANDLE, got %08x\n", GetLastError());
@@ -1530,7 +1482,7 @@ static void testFileStore(void)
/* apparently allows adding certificates.. */
ok(ret, "CertAddEncodedCertificateToStore failed: %d\n", ret);
/* but not commits.. */
- ret = pCertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED,
"Expected ERROR_CALL_NOT_IMPLEMENTED, got %08x\n", GetLastError());
/* It still has certs in memory.. */
@@ -1554,7 +1506,7 @@ static void testFileStore(void)
ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING,
bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCertificateToStore failed: %d\n", ret);
- ret = pCertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED,
"Expected ERROR_CALL_NOT_IMPLEMENTED, got %08x\n", GetLastError());
CertCloseStore(store, 0);
@@ -1569,7 +1521,7 @@ static void testFileStore(void)
ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING,
bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCertificateToStore failed: %d\n", ret);
- ret = pCertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED,
"Expected ERROR_CALL_NOT_IMPLEMENTED, got %08x\n", GetLastError());
CertCloseStore(store, 0);
@@ -1585,7 +1537,7 @@ static void testFileStore(void)
ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n",
GetLastError());
/* with commits enabled, commit is allowed */
- ret = pCertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(ret, "CertControlStore failed: %d\n", ret);
compareStore(store, "serialized store with cert",
serializedStoreWithCert, sizeof(serializedStoreWithCert), FALSE);
@@ -1701,15 +1653,11 @@ static void testFileNameStore(void)
BOOL ret;
DWORD GLE;
- if (0)
- {
- /* Crashes on NT4 */
- store = CertOpenStore(CERT_STORE_PROV_FILENAME_W, 0, 0, 0, NULL);
- GLE = GetLastError();
- ok(!store && (GLE == ERROR_PATH_NOT_FOUND || GLE == ERROR_INVALID_PARAMETER),
- "Expected ERROR_PATH_NOT_FOUND or ERROR_INVALID_PARAMETER, got %08x\n",
- GLE);
- }
+ store = CertOpenStore(CERT_STORE_PROV_FILENAME_W, 0, 0, 0, NULL);
+ GLE = GetLastError();
+ ok(!store && (GLE == ERROR_PATH_NOT_FOUND || GLE == ERROR_INVALID_PARAMETER),
+ "Expected ERROR_PATH_NOT_FOUND or ERROR_INVALID_PARAMETER, got %08x\n",
+ GLE);
if (!GetTempFileNameW(szDot, szPrefix, 0, filename))
return;
@@ -1736,11 +1684,8 @@ static void testFileNameStore(void)
GetLastError());
cert = CertEnumCertificatesInStore(store, cert);
ok(!cert, "Expected only one cert\n");
- if (pCertEnumCRLsInStore)
- {
- crl = pCertEnumCRLsInStore(store, NULL);
- ok(!crl, "Expected no CRLs\n");
- }
+ crl = CertEnumCRLsInStore(store, NULL);
+ ok(!crl, "Expected no CRLs\n");
CertCloseStore(store, 0);
DeleteFileW(filename);
@@ -1760,11 +1705,8 @@ static void testFileNameStore(void)
GetLastError());
cert = CertEnumCertificatesInStore(store, cert);
ok(!cert, "Expected only one cert\n");
- if (pCertEnumCRLsInStore)
- {
- crl = pCertEnumCRLsInStore(store, NULL);
- ok(!crl, "Expected no CRLs\n");
- }
+ crl = CertEnumCRLsInStore(store, NULL);
+ ok(!crl, "Expected no CRLs\n");
CertCloseStore(store, 0);
DeleteFileW(filename);
@@ -1784,13 +1726,10 @@ static void testFileNameStore(void)
GetLastError());
cert = CertEnumCertificatesInStore(store, cert);
ok(!cert, "Expected only one cert\n");
- if (pCertEnumCRLsInStore)
- {
- crl = pCertEnumCRLsInStore(store, NULL);
- ok(crl != NULL, "CertEnumCRLsInStore failed: %08x\n", GetLastError());
- crl = pCertEnumCRLsInStore(store, crl);
- ok(!crl, "Expected only one CRL\n");
- }
+ crl = CertEnumCRLsInStore(store, NULL);
+ ok(crl != NULL, "CertEnumCRLsInStore failed: %08x\n", GetLastError());
+ crl = CertEnumCRLsInStore(store, crl);
+ ok(!crl, "Expected only one CRL\n");
CertCloseStore(store, 0);
/* Don't delete it this time, the next test uses it */
@@ -1848,11 +1787,8 @@ static void testFileNameStore(void)
GetLastError());
cert = CertEnumCertificatesInStore(store, cert);
ok(!cert, "Expected only one cert\n");
- if (pCertEnumCRLsInStore)
- {
- crl = pCertEnumCRLsInStore(store, NULL);
- ok(!crl, "Expected no CRLs\n");
- }
+ crl = CertEnumCRLsInStore(store, NULL);
+ ok(!crl, "Expected no CRLs\n");
CertCloseStore(store, 0);
DeleteFileW(filename);
@@ -1872,11 +1808,8 @@ static void testFileNameStore(void)
GetLastError());
cert = CertEnumCertificatesInStore(store, cert);
ok(!cert, "Expected only one cert\n");
- if (pCertEnumCRLsInStore)
- {
- crl = pCertEnumCRLsInStore(store, NULL);
- ok(!crl, "Expected no CRLs\n");
- }
+ crl = CertEnumCRLsInStore(store, NULL);
+ ok(!crl, "Expected no CRLs\n");
CertCloseStore(store, 0);
DeleteFileW(filename);
@@ -1966,16 +1899,13 @@ static void testMessageStore(void)
} while (cert);
ok(count == 0, "Expected 0 certificates, got %d\n", count);
- if (pCertEnumCRLsInStore)
- {
- count = 0;
- do {
- crl = pCertEnumCRLsInStore(store, crl);
- if (crl)
- count++;
- } while (crl);
- ok(count == 0, "Expected 0 CRLs, got %d\n", count);
- }
+ count = 0;
+ do {
+ crl = CertEnumCRLsInStore(store, crl);
+ if (crl)
+ count++;
+ } while (crl);
+ ok(count == 0, "Expected 0 CRLs, got %d\n", count);
/* Can add certs to a message store */
ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING,
@@ -2017,16 +1947,14 @@ static void testMessageStore(void)
} while (cert);
ok(count == 1, "Expected 1 certificate, got %d\n", count);
- if (pCertEnumCRLsInStore)
- {
- count = 0;
- do {
- crl = pCertEnumCRLsInStore(store, crl);
- if (crl)
- count++;
- } while (crl);
- ok(count == 1, "Expected 1 CRL, got %d\n", count);
- }
+ count = 0;
+ do {
+ crl = CertEnumCRLsInStore(store, crl);
+ if (crl)
+ count++;
+ } while (crl);
+ ok(count == 1, "Expected 1 CRL, got %d\n", count);
+
CertCloseStore(store, 0);
}
/* Encoding appears to be ignored */
@@ -2046,9 +1974,7 @@ static void testMessageStore(void)
blob.pbData = (LPBYTE)hashBareContent;
SetLastError(0xdeadbeef);
store = CertOpenStore(CERT_STORE_PROV_PKCS7, 0, 0, 0, &blob);
- ok(!store &&
- (GetLastError() == CRYPT_E_ASN1_BADTAG ||
- broken(GetLastError() == OSS_DATA_ERROR)), /* NT4 */
+ ok(!store && GetLastError() == CRYPT_E_ASN1_BADTAG,
"Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
}
@@ -2082,11 +2008,9 @@ static void testSerializedStore(void)
GetLastError());
cert = CertEnumCertificatesInStore(store, cert);
ok(!cert, "Expected only one cert\n");
- if (pCertEnumCRLsInStore)
- {
- crl = pCertEnumCRLsInStore(store, NULL);
- ok(!crl, "Expected no CRLs\n");
- }
+ crl = CertEnumCRLsInStore(store, NULL);
+ ok(!crl, "Expected no CRLs\n");
+
CertCloseStore(store, 0);
}
blob.cbData = sizeof(serializedStoreWithCertAndCRL);
@@ -2103,14 +2027,12 @@ static void testSerializedStore(void)
GetLastError());
cert = CertEnumCertificatesInStore(store, cert);
ok(!cert, "Expected only one cert\n");
- if (pCertEnumCRLsInStore)
- {
- crl = pCertEnumCRLsInStore(store, NULL);
- ok(crl != NULL, "CertEnumCRLsInStore failed: %08x\n",
- GetLastError());
- crl = pCertEnumCRLsInStore(store, crl);
- ok(!crl, "Expected only one CRL\n");
- }
+ crl = CertEnumCRLsInStore(store, NULL);
+ ok(crl != NULL, "CertEnumCRLsInStore failed: %08x\n",
+ GetLastError());
+ crl = CertEnumCRLsInStore(store, crl);
+ ok(!crl, "Expected only one CRL\n");
+
CertCloseStore(store, 0);
}
}
@@ -2159,15 +2081,9 @@ static void testCertRegisterSystemStore(void)
const CERT_CONTEXT *cert, *cert2;
unsigned int i;
- if (!pCertRegisterSystemStore || !pCertUnregisterSystemStore)
- {
- win_skip("CertRegisterSystemStore() or CertUnregisterSystemStore() is not available\n");
- return;
- }
-
for (i = 0; i < sizeof(reg_system_store_test_data) / sizeof(reg_system_store_test_data[0]); i++) {
cur_flag = reg_system_store_test_data[i].cert_store;
- ret = pCertRegisterSystemStore(WineTestW, cur_flag, NULL, NULL);
+ ret = CertRegisterSystemStore(WineTestW, cur_flag, NULL, NULL);
if (!ret)
{
err = GetLastError();
@@ -2209,7 +2125,7 @@ static void testCertRegisterSystemStore(void)
ret = CertCloseStore(hstore, 0);
ok (ret, "CertCloseStore failed at %08x, last error %x\n", cur_flag, GetLastError());
- ret = pCertUnregisterSystemStore(WineTestW, cur_flag );
+ ret = CertUnregisterSystemStore(WineTestW, cur_flag );
todo_wine_if (reg_system_store_test_data[i].todo)
ok( ret == reg_system_store_test_data[i].expected,
"Unregistering failed at %08x, last error %d\n", cur_flag, GetLastError());
@@ -2237,23 +2153,17 @@ static void testCertEnumSystemStore(void)
BOOL ret;
struct EnumSystemStoreInfo info = { FALSE, 0 };
- if (!pCertEnumSystemStore)
- {
- win_skip("CertEnumSystemStore() is not available\n");
- return;
- }
-
SetLastError(0xdeadbeef);
- ret = pCertEnumSystemStore(0, NULL, NULL, NULL);
+ ret = CertEnumSystemStore(0, NULL, NULL, NULL);
ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError());
/* Crashes
- ret = pCertEnumSystemStore(CERT_SYSTEM_STORE_LOCAL_MACHINE, NULL, NULL,
+ ret = CertEnumSystemStore(CERT_SYSTEM_STORE_LOCAL_MACHINE, NULL, NULL,
NULL);
*/
SetLastError(0xdeadbeef);
- ret = pCertEnumSystemStore(CERT_SYSTEM_STORE_LOCAL_MACHINE, NULL, &info,
+ ret = CertEnumSystemStore(CERT_SYSTEM_STORE_LOCAL_MACHINE, NULL, &info,
enumSystemStoreCB);
/* Callback returning FALSE stops enumeration */
ok(!ret, "Expected CertEnumSystemStore to stop\n");
@@ -2262,7 +2172,7 @@ static void testCertEnumSystemStore(void)
info.goOn = TRUE;
info.storeCount = 0;
- ret = pCertEnumSystemStore(CERT_SYSTEM_STORE_LOCAL_MACHINE, NULL, &info,
+ ret = CertEnumSystemStore(CERT_SYSTEM_STORE_LOCAL_MACHINE, NULL, &info,
enumSystemStoreCB);
ok(ret, "CertEnumSystemStore failed: %08x\n", GetLastError());
/* There should always be at least My, Root, and CA stores */
@@ -2277,58 +2187,52 @@ static void testStoreProperty(void)
DWORD propID, size = 0, state;
CRYPT_DATA_BLOB blob;
- if (!pCertGetStoreProperty || !pCertSetStoreProperty)
- {
- win_skip("CertGet/SetStoreProperty() is not available\n");
- return;
- }
-
/* Crash
- ret = pCertGetStoreProperty(NULL, 0, NULL, NULL);
- ret = pCertGetStoreProperty(NULL, 0, NULL, &size);
- ret = pCertGetStoreProperty(store, 0, NULL, NULL);
+ ret = CertGetStoreProperty(NULL, 0, NULL, NULL);
+ ret = CertGetStoreProperty(NULL, 0, NULL, &size);
+ ret = CertGetStoreProperty(store, 0, NULL, NULL);
*/
store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
CERT_STORE_CREATE_NEW_FLAG, NULL);
/* Check a missing prop ID */
SetLastError(0xdeadbeef);
- ret = pCertGetStoreProperty(store, 0, NULL, &size);
+ ret = CertGetStoreProperty(store, 0, NULL, &size);
ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND,
"Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError());
/* Contrary to MSDN, CERT_ACCESS_STATE_PROP_ID is supported for stores.. */
size = sizeof(state);
- ret = pCertGetStoreProperty(store, CERT_ACCESS_STATE_PROP_ID, &state, &size);
+ ret = CertGetStoreProperty(store, CERT_ACCESS_STATE_PROP_ID, &state, &size);
ok(ret, "CertGetStoreProperty failed for CERT_ACCESS_STATE_PROP_ID: %08x\n",
GetLastError());
ok(!state, "Expected a non-persisted store\n");
/* and CERT_STORE_LOCALIZED_NAME_PROP_ID isn't supported by default. */
size = 0;
- ret = pCertGetStoreProperty(store, CERT_STORE_LOCALIZED_NAME_PROP_ID, NULL,
+ ret = CertGetStoreProperty(store, CERT_STORE_LOCALIZED_NAME_PROP_ID, NULL,
&size);
ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND,
"Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError());
/* Delete an arbitrary property on a store */
- ret = pCertSetStoreProperty(store, CERT_FIRST_USER_PROP_ID, 0, NULL);
+ ret = CertSetStoreProperty(store, CERT_FIRST_USER_PROP_ID, 0, NULL);
ok(ret, "CertSetStoreProperty failed: %08x\n", GetLastError());
/* Set an arbitrary property on a store */
blob.pbData = (LPBYTE)&state;
blob.cbData = sizeof(state);
- ret = pCertSetStoreProperty(store, CERT_FIRST_USER_PROP_ID, 0, &blob);
+ ret = CertSetStoreProperty(store, CERT_FIRST_USER_PROP_ID, 0, &blob);
ok(ret, "CertSetStoreProperty failed: %08x\n", GetLastError());
/* Get an arbitrary property that's been set */
- ret = pCertGetStoreProperty(store, CERT_FIRST_USER_PROP_ID, NULL, &size);
+ ret = CertGetStoreProperty(store, CERT_FIRST_USER_PROP_ID, NULL, &size);
ok(ret, "CertGetStoreProperty failed: %08x\n", GetLastError());
ok(size == sizeof(state), "Unexpected data size %d\n", size);
- ret = pCertGetStoreProperty(store, CERT_FIRST_USER_PROP_ID, &propID, &size);
+ ret = CertGetStoreProperty(store, CERT_FIRST_USER_PROP_ID, &propID, &size);
ok(ret, "CertGetStoreProperty failed: %08x\n", GetLastError());
ok(propID == state, "CertGetStoreProperty got the wrong value\n");
/* Delete it again */
- ret = pCertSetStoreProperty(store, CERT_FIRST_USER_PROP_ID, 0, NULL);
+ ret = CertSetStoreProperty(store, CERT_FIRST_USER_PROP_ID, 0, NULL);
ok(ret, "CertSetStoreProperty failed: %08x\n", GetLastError());
/* And check that it's missing */
SetLastError(0xdeadbeef);
- ret = pCertGetStoreProperty(store, CERT_FIRST_USER_PROP_ID, NULL, &size);
+ ret = CertGetStoreProperty(store, CERT_FIRST_USER_PROP_ID, NULL, &size);
ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND,
"Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError());
CertCloseStore(store, 0);
@@ -2336,13 +2240,13 @@ static void testStoreProperty(void)
/* Recheck on the My store.. */
store = CertOpenSystemStoreW(0, MyW);
size = sizeof(state);
- ret = pCertGetStoreProperty(store, CERT_ACCESS_STATE_PROP_ID, &state, &size);
+ ret = CertGetStoreProperty(store, CERT_ACCESS_STATE_PROP_ID, &state, &size);
ok(ret, "CertGetStoreProperty failed for CERT_ACCESS_STATE_PROP_ID: %08x\n",
GetLastError());
ok(state, "Expected a persisted store\n");
SetLastError(0xdeadbeef);
size = 0;
- ret = pCertGetStoreProperty(store, CERT_STORE_LOCALIZED_NAME_PROP_ID, NULL,
+ ret = CertGetStoreProperty(store, CERT_STORE_LOCALIZED_NAME_PROP_ID, NULL,
&size);
ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND,
"Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError());
@@ -2588,32 +2492,26 @@ static void testAddCertificateLink(void)
WCHAR filename1[MAX_PATH], filename2[MAX_PATH];
HANDLE file;
- if (!pCertAddCertificateLinkToStore)
- {
- win_skip("CertAddCertificateLinkToStore not found\n");
- return;
- }
-
if (0)
{
/* Crashes, i.e. the store is dereferenced without checking. */
- ret = pCertAddCertificateLinkToStore(NULL, NULL, 0, NULL);
+ ret = CertAddCertificateLinkToStore(NULL, NULL, 0, NULL);
}
/* Adding a certificate link to a store requires a valid add disposition */
store1 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
CERT_STORE_CREATE_NEW_FLAG, NULL);
SetLastError(0xdeadbeef);
- ret = pCertAddCertificateLinkToStore(store1, NULL, 0, NULL);
+ ret = CertAddCertificateLinkToStore(store1, NULL, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError());
source = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert,
sizeof(bigCert));
SetLastError(0xdeadbeef);
- ret = pCertAddCertificateLinkToStore(store1, source, 0, NULL);
+ ret = CertAddCertificateLinkToStore(store1, source, 0, NULL);
ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError());
- ret = pCertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS,
+ ret = CertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS,
NULL);
ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError());
if (0)
@@ -2621,14 +2519,14 @@ static void testAddCertificateLink(void)
/* Crashes, i.e. the source certificate is dereferenced without
* checking when a valid add disposition is given.
*/
- ret = pCertAddCertificateLinkToStore(store1, NULL, CERT_STORE_ADD_ALWAYS,
+ ret = CertAddCertificateLinkToStore(store1, NULL, CERT_STORE_ADD_ALWAYS,
NULL);
}
CertCloseStore(store1, 0);
store1 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
CERT_STORE_CREATE_NEW_FLAG, NULL);
- ret = pCertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS,
+ ret = CertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS,
&linked);
ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError());
if (ret)
@@ -2704,7 +2602,7 @@ static void testAddCertificateLink(void)
/* Test adding a link to a memory store. */
store2 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
CERT_STORE_CREATE_NEW_FLAG, NULL);
- ret = pCertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS,
+ ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS,
&linked);
ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError());
if (ret)
@@ -2766,7 +2664,7 @@ static void testAddCertificateLink(void)
ok(store2 != NULL, "CertOpenStore failed: %08x\n", GetLastError());
CloseHandle(file);
/* Test adding a link to a file store. */
- ret = pCertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS,
+ ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS,
&linked);
ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError());
if (ret)
@@ -2808,7 +2706,7 @@ static void testAddCertificateLink(void)
source = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert,
sizeof(bigCert));
SetLastError(0xdeadbeef);
- ret = pCertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS,
+ ret = CertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS,
&linked);
ok(!ret && GetLastError() == E_INVALIDARG,
"expected E_INVALIDARG, got %08x\n", GetLastError());
@@ -2835,13 +2733,13 @@ static void testAddCertificateLink(void)
ok(store2 != NULL, "CertOpenStore failed: %08x\n", GetLastError());
CloseHandle(file);
- ret = pCertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS,
+ ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS,
&linked);
ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError());
if (ret)
{
ok(linked->hCertStore == store2, "unexpected store\n");
- ret = pCertControlStore(store2, 0, CERT_STORE_CTRL_COMMIT, NULL);
+ ret = CertControlStore(store2, 0, CERT_STORE_CTRL_COMMIT, NULL);
ok(ret, "CertControlStore failed: %d\n", ret);
compareStore(store2, "file store -> system store",
serializedStoreWithCertAndHash,
@@ -2858,7 +2756,7 @@ static void testAddCertificateLink(void)
store2 = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY, 0, 0,
CERT_SYSTEM_STORE_CURRENT_USER, WineTestW);
ok(store2 != NULL, "CertOpenStore failed: %08x\n", GetLastError());
- ret = pCertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS,
+ ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS,
&linked);
ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError());
if (ret)
@@ -2893,7 +2791,7 @@ static DWORD countCRLsInStore(HCERTSTORE store)
DWORD crls = 0;
do {
- crl = pCertEnumCRLsInStore(store, crl);
+ crl = CertEnumCRLsInStore(store, crl);
if (crl)
crls++;
} while (crl);
@@ -3121,11 +3019,8 @@ static void test_I_UpdateStore(void)
ok(ret, "I_CertUpdateStore failed: %08x\n", GetLastError());
certs = countCertsInStore(store1);
ok(certs == 1, "Expected 1 cert, got %d\n", certs);
- if (pCertEnumCRLsInStore)
- {
- certs = countCRLsInStore(store1);
- ok(certs == 1, "Expected 1 CRL, got %d\n", certs);
- }
+ certs = countCRLsInStore(store1);
+ ok(certs == 1, "Expected 1 CRL, got %d\n", certs);
CertDeleteCertificateFromStore(cert);
/* If a context is deleted from store2, I_CertUpdateStore deletes it
@@ -3142,19 +3037,6 @@ static void test_I_UpdateStore(void)
START_TEST(store)
{
- HMODULE hdll;
-
- hdll = GetModuleHandleA("Crypt32.dll");
- pCertControlStore = (void*)GetProcAddress(hdll, "CertControlStore");
- pCertEnumCRLsInStore = (void*)GetProcAddress(hdll, "CertEnumCRLsInStore");
- pCertEnumSystemStore = (void*)GetProcAddress(hdll, "CertEnumSystemStore");
- pCertGetStoreProperty = (void*)GetProcAddress(hdll, "CertGetStoreProperty");
- pCertRemoveStoreFromCollection = (void*)GetProcAddress(hdll, "CertRemoveStoreFromCollection");
- pCertSetStoreProperty = (void*)GetProcAddress(hdll, "CertSetStoreProperty");
- pCertAddCertificateLinkToStore = (void*)GetProcAddress(hdll, "CertAddCertificateLinkToStore");
- pCertRegisterSystemStore = (void*)GetProcAddress(hdll, "CertRegisterSystemStore");
- pCertUnregisterSystemStore = (void*)GetProcAddress(hdll, "CertUnregisterSystemStore");
-
/* various combinations of CertOpenStore */
testMemStore();
testCollectionStore();
--
2.16.1
Jan. 30, 2018
[PATCH 1/2] include: Add CertRegisterSystemStore and CertUnregisterSystemStore
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/crypt32/store.c | 2 +-
include/wincrypt.h | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c
index 91a3cbc0dc..bc4ebde5f6 100644
--- a/dlls/crypt32/store.c
+++ b/dlls/crypt32/store.c
@@ -1414,7 +1414,7 @@ BOOL WINAPI CertRegisterSystemStore(const void *pvSystemStore, DWORD dwFlags,
return FALSE;
}
-BOOL WINAPI CertUnregisterSystemStore(void *pvSystemStore, DWORD dwFlags)
+BOOL WINAPI CertUnregisterSystemStore(const void *pvSystemStore, DWORD dwFlags)
{
HCERTSTORE hstore;
diff --git a/include/wincrypt.h b/include/wincrypt.h
index 6986bd819e..a793e8ad22 100644
--- a/include/wincrypt.h
+++ b/include/wincrypt.h
@@ -4084,6 +4084,11 @@ BOOL WINAPI CertEnumSystemStoreLocation(DWORD dwFlags, void *pvArg,
BOOL WINAPI CertEnumSystemStore(DWORD dwFlags, void *pvSystemStoreLocationPara,
void *pvArg, PFN_CERT_ENUM_SYSTEM_STORE pfnEnum);
+BOOL WINAPI CertRegisterSystemStore(const void *store, DWORD flags,
+ CERT_SYSTEM_STORE_INFO *info, void *reserved);
+
+BOOL WINAPI CertUnregisterSystemStore(const void *store, DWORD flags);
+
BOOL WINAPI CertEnumPhysicalStore(const void *pvSystemStore, DWORD dwFlags,
void *pvArg, PFN_CERT_ENUM_PHYSICAL_STORE pfnEnum);
--
2.16.1
Jan. 30, 2018
[PATCH 7/7] wmp: Implement minimal headless WMP
by Anton Romanov
Signed-off-by: Anton Romanov <theli.ua(a)gmail.com>
---
dlls/wmp/player.c | 328 +++++++++++++++++++++++++++++++++++++++++++------
dlls/wmp/wmp_private.h | 35 ++++++
2 files changed, 325 insertions(+), 38 deletions(-)
diff --git a/dlls/wmp/player.c b/dlls/wmp/player.c
index 69979be21d..e12fed7d3a 100644
--- a/dlls/wmp/player.c
+++ b/dlls/wmp/player.c
@@ -17,12 +17,14 @@
*/
#include "wmp_private.h"
+#include "wmpids.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(wmp);
-static void update_state(WindowsMediaPlayer *wmp, int state);
+static void update_state(WindowsMediaPlayer *wmp, LONG type, LONG state);
+static void media_change(WindowsMediaPlayer *wmp, LONG type, IDispatch *pItem);
static inline WindowsMediaPlayer *impl_from_IWMPNetwork(IWMPNetwork *iface)
{
@@ -44,6 +46,20 @@ static inline WindowsMediaPlayer *impl_from_IWMPControls(IWMPControls *iface)
return CONTAINING_RECORD(iface, WindowsMediaPlayer, IWMPControls_iface);
}
+HRESULT WINAPI WMPControls_play(IWMPControls *iface)
+{
+ HRESULT hres;
+ WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
+ TRACE("(%p)\n", This);
+ hres = IMediaControl_Run(This->media_control);
+ if (SUCCEEDED(hres))
+ {
+ update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, WMP_PLAY_STATE_PLAYING);
+ media_change(This, DISPID_WMPCOREEVENT_MEDIACHANGE, (IDispatch*)&This->IWMPMedia_iface);
+ }
+ return hres;
+}
+
static HRESULT WINAPI WMPPlayer4_QueryInterface(IWMPPlayer4 *iface, REFIID riid, void **ppv)
{
WindowsMediaPlayer *This = impl_from_IWMPPlayer4(iface);
@@ -105,15 +121,49 @@ static HRESULT WINAPI WMPPlayer4_close(IWMPPlayer4 *iface)
static HRESULT WINAPI WMPPlayer4_get_URL(IWMPPlayer4 *iface, BSTR *pbstrURL)
{
WindowsMediaPlayer *This = impl_from_IWMPPlayer4(iface);
- FIXME("(%p)->(%p)\n", This, pbstrURL);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, pbstrURL);
+ if (!pbstrURL)
+ return E_POINTER;
+
+ *pbstrURL = This->url;
+
+ return S_OK;
}
static HRESULT WINAPI WMPPlayer4_put_URL(IWMPPlayer4 *iface, BSTR url)
{
+ HRESULT hres;
WindowsMediaPlayer *This = impl_from_IWMPPlayer4(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(url));
- return E_NOTIMPL;
+ TRACE("(%p)->(%s)\n", This, debugstr_w(url));
+ if (!url)
+ return E_POINTER;
+ if (This->url) {
+ heap_free(This->url);
+ }
+ This->url = heap_strdupW(url);
+
+ if (!This->url)
+ return E_OUTOFMEMORY;
+
+ update_state(This, DISPID_WMPCOREEVENT_OPENSTATECHANGE, WMP_OPEN_STATE_PLAYLIST_CHANGING);
+ update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, WMP_PLAY_STATE_TRANSITIONING);
+ media_change(This, DISPID_WMPCOREEVENT_CURRENTITEMCHANGE, (IDispatch*)&This->IWMPMedia_iface);
+ update_state(This, DISPID_WMPCOREEVENT_OPENSTATECHANGE, WMP_OPEN_STATE_PLAYLIST_CHANGED);
+ update_state(This, DISPID_WMPCOREEVENT_OPENSTATECHANGE, WMP_OPEN_STATE_PLAYLIST_OPEN_NO_MEDIA);
+ media_change(This, DISPID_WMPCOREEVENT_CURRENTITEMCHANGE, (IDispatch*)&This->IWMPMedia_iface);
+ update_state(This, DISPID_WMPCOREEVENT_OPENSTATECHANGE, WMP_OPEN_STATE_OPENING_UNKNOWN_URL);
+ update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, WMP_PLAY_STATE_TRANSITIONING);
+ media_change(This, DISPID_WMPCOREEVENT_CURRENTITEMCHANGE, (IDispatch*)&This->IWMPMedia_iface);
+
+ hres = IGraphBuilder_RenderFile(This->pFilterGraph, url, NULL);
+ if (SUCCEEDED(hres)) {
+ update_state(This, DISPID_WMPCOREEVENT_OPENSTATECHANGE, WMP_OPEN_STATE_MEDIA_OPEN);
+ }
+
+ if (SUCCEEDED(hres) && This->autoStart)
+ WMPControls_play((IWMPControls*)This);
+
+ return hres;
}
static HRESULT WINAPI WMPPlayer4_get_openState(IWMPPlayer4 *iface, WMPOpenState *pwmpos)
@@ -504,15 +554,19 @@ static HRESULT WINAPI WMPSettings_get_isAvailable(IWMPSettings *iface, BSTR item
static HRESULT WINAPI WMPSettings_get_autoStart(IWMPSettings *iface, VARIANT_BOOL *p)
{
WindowsMediaPlayer *This = impl_from_IWMPSettings(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ if (!p)
+ return E_POINTER;
+ *p = This->autoStart;
+ return S_OK;
}
static HRESULT WINAPI WMPSettings_put_autoStart(IWMPSettings *iface, VARIANT_BOOL v)
{
WindowsMediaPlayer *This = impl_from_IWMPSettings(iface);
- FIXME("(%p)->(%x)\n", This, v);
- return E_NOTIMPL;
+ TRACE("(%p)->(%x)\n", This, v);
+ This->autoStart = v;
+ return S_OK;
}
static HRESULT WINAPI WMPSettings_get_baseURL(IWMPSettings *iface, BSTR *p)
@@ -546,15 +600,21 @@ static HRESULT WINAPI WMPSettings_put_defaultFrame(IWMPSettings *iface, BSTR v)
static HRESULT WINAPI WMPSettings_get_invokeURLs(IWMPSettings *iface, VARIANT_BOOL *p)
{
WindowsMediaPlayer *This = impl_from_IWMPSettings(iface);
+ // Leaving as FIXME as we don't currently use this
FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ if (!p)
+ return E_POINTER;
+ *p = This->invokeURLs;
+ return S_OK;
}
static HRESULT WINAPI WMPSettings_put_invokeURLs(IWMPSettings *iface, VARIANT_BOOL v)
{
WindowsMediaPlayer *This = impl_from_IWMPSettings(iface);
+ // Leaving as FIXME as we don't currently use this
FIXME("(%p)->(%x)\n", This, v);
- return E_NOTIMPL;
+ This->invokeURLs = v;
+ return S_OK;
}
static HRESULT WINAPI WMPSettings_get_mute(IWMPSettings *iface, VARIANT_BOOL *p)
@@ -615,16 +675,26 @@ static HRESULT WINAPI WMPSettings_put_balance(IWMPSettings *iface, LONG v)
static HRESULT WINAPI WMPSettings_get_volume(IWMPSettings *iface, LONG *p)
{
+ HRESULT hres;
WindowsMediaPlayer *This = impl_from_IWMPSettings(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ hres = IBasicAudio_get_Volume(This->basic_audio, p);
+ /* IBasicAudio - [-10000, 0], wmp - [0, 100] */
+ if (SUCCEEDED(hres))
+ *p = (*p + 10000) * 100 / 10000;
+ return hres;
}
static HRESULT WINAPI WMPSettings_put_volume(IWMPSettings *iface, LONG v)
{
+ HRESULT hres;
WindowsMediaPlayer *This = impl_from_IWMPSettings(iface);
- FIXME("(%p)->(%d)\n", This, v);
- return E_NOTIMPL;
+ TRACE("(%p)->(%d)\n", This, v);
+ /* IBasicAudio - [-10000, 0], wmp - [0, 100] */
+ v = 10000 * v / 100 - 10000;
+ hres = IBasicAudio_put_Volume(This->basic_audio, v);
+ TRACE("ret: %d", hres);
+ return hres;
}
static HRESULT WINAPI WMPSettings_getMode(IWMPSettings *iface, BSTR mode, VARIANT_BOOL *p)
@@ -644,15 +714,21 @@ static HRESULT WINAPI WMPSettings_setMode(IWMPSettings *iface, BSTR mode, VARIAN
static HRESULT WINAPI WMPSettings_get_enableErrorDialogs(IWMPSettings *iface, VARIANT_BOOL *p)
{
WindowsMediaPlayer *This = impl_from_IWMPSettings(iface);
+ // Leaving as FIXME as we don't currently use this
FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ if (!p)
+ return E_POINTER;
+ *p = This->enableErrorDialogs;
+ return S_OK;
}
static HRESULT WINAPI WMPSettings_put_enableErrorDialogs(IWMPSettings *iface, VARIANT_BOOL v)
{
WindowsMediaPlayer *This = impl_from_IWMPSettings(iface);
+ // Leaving as FIXME as we don't currently use this
FIXME("(%p)->(%x)\n", This, v);
- return E_NOTIMPL;
+ This->enableErrorDialogs = v;
+ return S_OK;
}
static const IWMPSettingsVtbl WMPSettingsVtbl = {
@@ -689,9 +765,124 @@ static const IWMPSettingsVtbl WMPSettingsVtbl = {
};
void destroy_player(WindowsMediaPlayer* wmp) {
+ /* shutdown event thread */
+ if (wmp->event_thread)
+ {
+ SetEvent(wmp->stop_event);
+ WaitForSingleObject(wmp->event_thread, INFINITE);
+ CloseHandle(wmp->event_thread);
+ CloseHandle(wmp->stop_event);
+ }
+
+ if (wmp->media_seeking)
+ IMediaSeeking_Release(wmp->media_seeking);
+ if (wmp->media_event)
+ IBasicAudio_Release(wmp->basic_audio);
+ if (wmp->media_event)
+ IMediaEvent_Release(wmp->media_event);
+ if (wmp->media_control)
+ IMediaControl_Release(wmp->media_control);
+ if (wmp->pFilterGraph)
+ IGraphBuilder_Release(wmp->pFilterGraph);
+ if (wmp->url)
+ heap_free(wmp->url);
heap_free(wmp);
}
+static void status_change(WindowsMediaPlayer *wmp)
+{
+ DISPPARAMS dispparams;
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ dispparams.rgvarg = NULL;
+
+ call_sink(wmp->wmpocx, DISPID_WMPCOREEVENT_STATUSCHANGE,
+ &dispparams);
+}
+
+static void media_change(WindowsMediaPlayer *wmp, LONG type, IDispatch *pItem)
+{
+ DISPPARAMS dispparams;
+ VARIANTARG params[1];
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ dispparams.rgvarg = params;
+
+ V_VT(params) = VT_DISPATCH;
+ V_DISPATCH(params) = pItem;
+
+ call_sink(wmp->wmpocx, type,
+ &dispparams);
+ status_change(wmp);
+}
+static void update_state(WindowsMediaPlayer *wmp, LONG type, LONG state)
+{
+ DISPPARAMS dispparams;
+ VARIANTARG params[1];
+
+ dispparams.cArgs = 1;
+ dispparams.cNamedArgs = 0;
+ dispparams.rgdispidNamedArgs = NULL;
+ dispparams.rgvarg = params;
+
+ V_VT(params) = VT_UI4;
+ V_UI4(params) = state;
+
+ call_sink(wmp->wmpocx, type,
+ &dispparams);
+ status_change(wmp);
+}
+
+static DWORD CALLBACK WMP_event_thread(LPVOID parm)
+{
+ WindowsMediaPlayer* wmp = (WindowsMediaPlayer *)parm;
+ HRESULT hr;
+ HANDLE handle[2];
+ DWORD n = 0, ret = 0;
+
+ handle[n++] = wmp->stop_event;
+ IMediaEvent_GetEventHandle(wmp->media_event, (OAEVENT *)&handle[n++]);
+ for (;;) {
+ DWORD r;
+
+ r = WaitForMultipleObjects(n, handle, FALSE, INFINITE);
+ if (r == WAIT_OBJECT_0) {
+ TRACE("got stop event\n");
+ break;
+ }
+ else if (r == WAIT_OBJECT_0+1) {
+ LONG event_code;
+ LONG_PTR p1, p2;
+ do {
+ hr = IMediaEvent_GetEvent(wmp->media_event, &event_code, &p1, &p2, 0);
+ if (SUCCEEDED(hr)) {
+ TRACE("got event_code = 0x%02x\n", event_code);
+ /* For now we only handle EC_COMPLETE */
+ if (event_code == EC_COMPLETE) {
+ update_state(wmp, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, WMP_PLAY_STATE_MEDIA_ENDED);
+ media_change(wmp, DISPID_WMPCOREEVENT_MEDIACHANGE, (IDispatch*)&wmp->IWMPMedia_iface);
+ update_state(wmp, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, WMP_PLAY_STATE_TRANSITIONING);
+ update_state(wmp, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, WMP_PLAY_STATE_STOPPED);
+ }
+
+ IMediaEvent_FreeEventParams(wmp->media_event, event_code, p1, p2);
+ }
+ } while (hr == S_OK);
+ }
+ else {
+ TRACE("Unknown error (%d)\n", (int)r);
+ break;
+ }
+ }
+
+ return ret;
+}
+
+
HRESULT WINAPI WMPControls_fastForward(IWMPControls *iface)
{
WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
@@ -723,8 +914,14 @@ HRESULT WINAPI WMPControls_get_currentMarker(IWMPControls *iface, LONG *plMarker
HRESULT WINAPI WMPControls_get_currentPosition(IWMPControls *iface, DOUBLE *pdCurrentPosition)
{
WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
- FIXME("(%p)->(%p)\n", This, pdCurrentPosition);
- return E_NOTIMPL;
+ HRESULT hres;
+ LONGLONG currentPosition;
+
+ TRACE("(%p)->(%p)\n", This, pdCurrentPosition);
+ hres = IMediaSeeking_GetCurrentPosition(This->media_seeking, ¤tPosition);
+ *pdCurrentPosition = (DOUBLE) currentPosition / 10000000.0f;
+ TRACE("hres: %d, pos: %f\n", hres, *pdCurrentPosition);
+ return hres;
}
HRESULT WINAPI WMPControls_get_currentPositionString(IWMPControls *iface, BSTR *pbstrCurrentPosition)
@@ -736,9 +933,22 @@ HRESULT WINAPI WMPControls_get_currentPositionString(IWMPControls *iface, BSTR *
static HRESULT WINAPI WMPControls_get_isAvailable(IWMPControls *iface, BSTR bstrItem, VARIANT_BOOL *pIsAvailable)
{
+ HRESULT hres = E_NOTIMPL;
WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(bstrItem));
- return E_NOTIMPL;
+ static const WCHAR currentPosition[] = {'c','u','r','r','e','n','t','P','o','s','i','t','i','o','n',0};
+ TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrItem), pIsAvailable);
+ if (strcmpW(currentPosition, bstrItem) == 0) {
+ DWORD capabilities;
+ hres = IMediaSeeking_GetCapabilities(This->media_seeking, &capabilities);
+ *pIsAvailable = (capabilities & AM_SEEKING_CanSeekAbsolute) ?
+ VARIANT_TRUE : VARIANT_FALSE;
+ } else {
+ FIXME("%s not implemented\n", debugstr_w(bstrItem));
+ }
+ hres = S_OK;
+ *pIsAvailable = VARIANT_TRUE;
+
+ return hres;
}
HRESULT WINAPI WMPControls_next(IWMPControls *iface)
@@ -755,13 +965,6 @@ HRESULT WINAPI WMPControls_pause(IWMPControls *iface)
return E_NOTIMPL;
}
-HRESULT WINAPI WMPControls_play(IWMPControls *iface)
-{
- WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
- FIXME("(%p)\n", This);
- return E_NOTIMPL;
-}
-
HRESULT WINAPI WMPControls_playItem(IWMPControls *iface, IWMPMedia *pIWMPMedia)
{
WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
@@ -792,16 +995,27 @@ HRESULT WINAPI WMPControls_put_currentMarker(IWMPControls *iface, LONG lMarker)
HRESULT WINAPI WMPControls_put_currentPosition(IWMPControls *iface, DOUBLE dCurrentPosition)
{
+ LONGLONG Current;
+ HRESULT hres;
WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
- FIXME("(%p)->(%f)\n", This, dCurrentPosition);
- return E_NOTIMPL;
+ TRACE("(%p)->(%f)\n", This, dCurrentPosition);
+ Current = 10000000 * dCurrentPosition;
+ hres = IMediaSeeking_SetPositions(This->media_seeking, &Current,
+ AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning);
+
+ return hres;
}
HRESULT WINAPI WMPControls_stop(IWMPControls *iface)
{
+ HRESULT hres;
WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
- FIXME("(%p)\n", This);
- return E_NOTIMPL;
+ TRACE("(%p)\n", This);
+ update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, WMP_PLAY_STATE_TRANSITIONING);
+ hres = IMediaControl_Stop(This->media_control);
+ if (SUCCEEDED(hres))
+ update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, WMP_PLAY_STATE_STOPPED);
+ return hres;
}
static HRESULT WINAPI WMPControls_QueryInterface(IWMPControls *iface, REFIID riid, void **ppv)
@@ -946,9 +1160,15 @@ HRESULT WINAPI WMPMedia_getMarkerName(IWMPMedia *iface, LONG MarkerNum, BSTR *pb
HRESULT WINAPI WMPMedia_get_duration(IWMPMedia *iface, DOUBLE *pDuration)
{
+ LONGLONG duration;
+ HRESULT hres;
WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
- FIXME("(%p)->(%p)\n", This, pDuration);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, pDuration);
+ hres = IMediaSeeking_GetDuration(This->media_seeking, &duration);
+ if (SUCCEEDED(hres))
+ *pDuration = (DOUBLE)duration / 10000000.0f;
+ TRACE("%d, %f, %lld\n", hres, *pDuration, duration);
+ return hres;
}
HRESULT WINAPI WMPMedia_get_durationString(IWMPMedia *iface, BSTR *pbstrDuration)
@@ -1189,8 +1409,9 @@ static HRESULT WINAPI WMPNetwork_get_bufferingCount(IWMPNetwork *iface, LONG *pl
static HRESULT WINAPI WMPNetwork_get_bufferingProgress(IWMPNetwork *iface, LONG *plBufferingProgress)
{
WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
- FIXME("(%p)->(%p)\n", This, plBufferingProgress);
- return E_NOTIMPL;
+ FIXME("stub, returning 100 (%p)->(%p)\n", This, plBufferingProgress);
+ *plBufferingProgress = 100;
+ return S_OK;
}
static HRESULT WINAPI WMPNetwork_get_bufferingTime(IWMPNetwork *iface, LONG *plBufferingTime)
@@ -1315,8 +1536,9 @@ static HRESULT WINAPI WMPNetwork_put_maxBandwidth(IWMPNetwork *iface, LONG lMaxB
static HRESULT WINAPI WMPNetwork_get_downloadProgress(IWMPNetwork *iface, LONG *plDownloadProgress)
{
WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
- FIXME("(%p)->(%p)\n", This, plDownloadProgress);
- return E_NOTIMPL;
+ FIXME("stub, returning 100 (%p)->(%p)\n", This, plDownloadProgress);
+ *plDownloadProgress = 100;
+ return S_OK;
}
static HRESULT WINAPI WMPNetwork_get_encodedFrameRate(IWMPNetwork *iface, LONG *plFrameRate)
@@ -1373,11 +1595,41 @@ static const IWMPNetworkVtbl WMPNetworkVtbl = {
HRESULT init_player(WindowsMediaPlayer *wmp)
{
+ HRESULT hres;
+
wmp->IWMPPlayer4_iface.lpVtbl = &WMPPlayer4Vtbl;
wmp->IWMPSettings_iface.lpVtbl = &WMPSettingsVtbl;
wmp->IWMPControls_iface.lpVtbl = &WMPControlsVtbl;
wmp->IWMPMedia_iface.lpVtbl = &WMPMediaVtbl;
wmp->IWMPNetwork_iface.lpVtbl = &WMPNetworkVtbl;
+ wmp->invokeURLs = TRUE;
+ wmp->autoStart = TRUE;
+
+
+ hres = CoCreateInstance(&CLSID_FilterGraph,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ &IID_IGraphBuilder,
+ (void **)&wmp->pFilterGraph);
+ if (SUCCEEDED(hres))
+ hres = IGraphBuilder_QueryInterface(wmp->pFilterGraph, &IID_IMediaControl, (void**)&wmp->media_control);
+ if (SUCCEEDED(hres))
+ hres = IGraphBuilder_QueryInterface(wmp->pFilterGraph, &IID_IMediaEvent, (void**)&wmp->media_event);
+ if (SUCCEEDED(hres))
+ hres = IGraphBuilder_QueryInterface(wmp->pFilterGraph, &IID_IBasicAudio, (void**)&wmp->basic_audio);
+ if (SUCCEEDED(hres))
+ hres = IGraphBuilder_QueryInterface(wmp->pFilterGraph, &IID_IMediaSeeking, (void**)&wmp->media_seeking);
+ if (SUCCEEDED(hres))
+ hres = IMediaSeeking_SetTimeFormat(wmp->media_seeking, &TIME_FORMAT_MEDIA_TIME);
+ if (SUCCEEDED(hres))
+ {
+ wmp->stop_event = CreateEventW(NULL, FALSE, FALSE, NULL);
+ wmp->event_thread = CreateThread(NULL, 0, WMP_event_thread, wmp, 0, NULL);
+ }
+ if (!wmp->event_thread) {
+ TRACE("Can't create thread\n");
+ return E_FAIL;
+ }
return S_OK;
}
diff --git a/dlls/wmp/wmp_private.h b/dlls/wmp/wmp_private.h
index 5b79fafa07..6816c5893a 100644
--- a/dlls/wmp/wmp_private.h
+++ b/dlls/wmp/wmp_private.h
@@ -21,6 +21,8 @@
#include "windows.h"
#include "ole2.h"
#include "wmp.h"
+#include "wine/unicode.h"
+#include "dshow.h"
typedef struct {
IConnectionPoint IConnectionPoint_iface;
@@ -54,6 +56,23 @@ struct WindowsMediaPlayer {
SIZEL extent;
ConnectionPoint *wmpocx;
+
+ /* Settings */
+ VARIANT_BOOL autoStart;
+ VARIANT_BOOL invokeURLs;
+ VARIANT_BOOL enableErrorDialogs;
+ BSTR url;
+
+ /* DirectShow stuff */
+ IGraphBuilder* pFilterGraph;
+ IMediaControl* media_control;
+ IMediaEvent* media_event;
+ IBasicAudio * basic_audio;
+ IMediaSeeking * media_seeking;
+
+ /* Async event notification */
+ HANDLE event_thread;
+ HANDLE stop_event;
};
HRESULT init_player(WindowsMediaPlayer*) DECLSPEC_HIDDEN;
@@ -83,3 +102,19 @@ static inline BOOL heap_free(void *mem)
{
return HeapFree(GetProcessHeap(), 0, mem);
}
+
+static inline WCHAR *heap_strdupW(const WCHAR *str)
+{
+ WCHAR *ret;
+
+ if(str) {
+ size_t size = strlenW(str)+1;
+ ret = heap_alloc(size*sizeof(WCHAR));
+ if(ret)
+ memcpy(ret, str, size*sizeof(WCHAR));
+ }else {
+ ret = NULL;
+ }
+
+ return ret;
+}
--
2.15.1
Jan. 30, 2018
[PATCH 6/7] wmp: Add IWMPNetwork stub
by Anton Romanov
Signed-off-by: Anton Romanov <theli.ua(a)gmail.com>
---
dlls/wmp/player.c | 300 ++++++++++++++++++++++++++++++++++++++++++++++++-
dlls/wmp/wmp_private.h | 1 +
2 files changed, 298 insertions(+), 3 deletions(-)
diff --git a/dlls/wmp/player.c b/dlls/wmp/player.c
index c15a79e2d0..69979be21d 100644
--- a/dlls/wmp/player.c
+++ b/dlls/wmp/player.c
@@ -24,6 +24,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(wmp);
static void update_state(WindowsMediaPlayer *wmp, int state);
+static inline WindowsMediaPlayer *impl_from_IWMPNetwork(IWMPNetwork *iface)
+{
+ return CONTAINING_RECORD(iface, WindowsMediaPlayer, IWMPNetwork_iface);
+}
+
static inline WindowsMediaPlayer *impl_from_IWMPMedia(IWMPMedia *iface)
{
return CONTAINING_RECORD(iface, WindowsMediaPlayer, IWMPMedia_iface);
@@ -201,8 +206,12 @@ static HRESULT WINAPI WMPPlayer4_launchURL(IWMPPlayer4 *iface, BSTR url)
static HRESULT WINAPI WMPPlayer4_get_network(IWMPPlayer4 *iface, IWMPNetwork **ppQNI)
{
WindowsMediaPlayer *This = impl_from_IWMPPlayer4(iface);
- FIXME("(%p)->(%p)\n", This, ppQNI);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, ppQNI);
+
+ IWMPNetwork_AddRef(&This->IWMPNetwork_iface);
+ *ppQNI = &This->IWMPNetwork_iface;
+ return S_OK;
}
static HRESULT WINAPI WMPPlayer4_get_currentPlaylist(IWMPPlayer4 *iface, IWMPPlaylist **ppPL)
@@ -1049,7 +1058,6 @@ static HRESULT WINAPI WMPMedia_Invoke(IWMPMedia *iface, DISPID dispIdMember,
return E_NOTIMPL;
}
-
static const IWMPMediaVtbl WMPMediaVtbl = {
WMPMedia_QueryInterface,
WMPMedia_AddRef,
@@ -1078,12 +1086,298 @@ static const IWMPMediaVtbl WMPMediaVtbl = {
WMPMedia_isReadOnlyItem
};
+static HRESULT WINAPI WMPNetwork_QueryInterface(IWMPNetwork *iface, REFIID riid, void **ppv)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
+}
+
+static ULONG WINAPI WMPNetwork_AddRef(IWMPNetwork *iface)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ return IOleObject_AddRef(&This->IOleObject_iface);
+}
+
+static ULONG WINAPI WMPNetwork_Release(IWMPNetwork *iface)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ return IOleObject_Release(&This->IOleObject_iface);
+}
+
+static HRESULT WINAPI WMPNetwork_GetTypeInfoCount(IWMPNetwork *iface, UINT *pctinfo)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_GetTypeInfo(IWMPNetwork *iface, UINT iTInfo,
+ LCID lcid, ITypeInfo **ppTInfo)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%u %d %p)\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_GetIDsOfNames(IWMPNetwork *iface, REFIID riid,
+ LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s %p %u %d %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_Invoke(IWMPNetwork *iface, DISPID dispIdMember,
+ REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%d %s %d %x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), lcid,
+ wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_bandWidth(IWMPNetwork *iface, LONG *plBandwidth)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plBandwidth);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_recoveredPackets(IWMPNetwork *iface, LONG *plRecoveredPackets)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plRecoveredPackets);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_sourceProtocol(IWMPNetwork *iface, BSTR *pbstrSourceProtocol)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, pbstrSourceProtocol);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_receivedPackets(IWMPNetwork *iface, LONG *plReceivedPackets)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plReceivedPackets);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_lostPackets(IWMPNetwork *iface, LONG *plLostPackets)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plLostPackets);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_receptionQuality(IWMPNetwork *iface, LONG *plReceptionQuality)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plReceptionQuality);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_bufferingCount(IWMPNetwork *iface, LONG *plBufferingCount)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plBufferingCount);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_bufferingProgress(IWMPNetwork *iface, LONG *plBufferingProgress)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plBufferingProgress);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_bufferingTime(IWMPNetwork *iface, LONG *plBufferingTime)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plBufferingTime);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_put_bufferingTime(IWMPNetwork *iface, LONG lBufferingTime)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%d)\n", This, lBufferingTime);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_frameRate(IWMPNetwork *iface, LONG *plFrameRate)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plFrameRate);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_maxBitRate(IWMPNetwork *iface, LONG *plBitRate)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plBitRate);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_bitRate(IWMPNetwork *iface, LONG *plBitRate)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plBitRate);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_getProxySettings(IWMPNetwork *iface, BSTR bstrProtocol, LONG *plProxySetting)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %p)\n", This, debugstr_w(bstrProtocol), plProxySetting);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_setProxySettings(IWMPNetwork *iface, BSTR bstrProtocol, LONG lProxySetting)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %d)\n", This, debugstr_w(bstrProtocol), lProxySetting);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_getProxyName(IWMPNetwork *iface, BSTR bstrProtocol, BSTR *pbstrProxyName)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %p)\n", This, debugstr_w(bstrProtocol), pbstrProxyName);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_setProxyName(IWMPNetwork *iface, BSTR bstrProtocol, BSTR bstrProxyName)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %s)\n", This, debugstr_w(bstrProtocol), debugstr_w(bstrProxyName));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_getProxyPort(IWMPNetwork *iface, BSTR bstrProtocol, LONG *plProxyPort)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %p)\n", This, debugstr_w(bstrProtocol), plProxyPort);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_setProxyPort(IWMPNetwork *iface, BSTR bstrProtocol, LONG lProxyPort)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %d)\n", This, debugstr_w(bstrProtocol), lProxyPort);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_getProxyExceptionList(IWMPNetwork *iface, BSTR bstrProtocol, BSTR *pbstrExceptionList)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %p)\n", This, debugstr_w(bstrProtocol), pbstrExceptionList);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_setProxyExceptionList(IWMPNetwork *iface, BSTR bstrProtocol, BSTR bstrExceptionList)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %s)\n", This, debugstr_w(bstrProtocol), debugstr_w(bstrExceptionList));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_getProxyBypassForLocal(IWMPNetwork *iface, BSTR bstrProtocol, VARIANT_BOOL *pfBypassForLocal)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %p)\n", This, debugstr_w(bstrProtocol), pfBypassForLocal);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_setProxyBypassForLocal(IWMPNetwork *iface, BSTR bstrProtocol, VARIANT_BOOL fBypassForLocal)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%s, %d)\n", This, debugstr_w(bstrProtocol), fBypassForLocal);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_maxBandwidth(IWMPNetwork *iface, LONG *plMaxBandwidth)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plMaxBandwidth);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_put_maxBandwidth(IWMPNetwork *iface, LONG lMaxBandwidth)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%d)\n", This, lMaxBandwidth);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_downloadProgress(IWMPNetwork *iface, LONG *plDownloadProgress)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plDownloadProgress);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_encodedFrameRate(IWMPNetwork *iface, LONG *plFrameRate)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plFrameRate);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPNetwork_get_framesSkipped(IWMPNetwork *iface, LONG *plFrames)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPNetwork(iface);
+ FIXME("(%p)->(%p)\n", This, plFrames);
+ return E_NOTIMPL;
+}
+
+static const IWMPNetworkVtbl WMPNetworkVtbl = {
+ WMPNetwork_QueryInterface,
+ WMPNetwork_AddRef,
+ WMPNetwork_Release,
+ WMPNetwork_GetTypeInfoCount,
+ WMPNetwork_GetTypeInfo,
+ WMPNetwork_GetIDsOfNames,
+ WMPNetwork_Invoke,
+ WMPNetwork_get_bandWidth,
+ WMPNetwork_get_recoveredPackets,
+ WMPNetwork_get_sourceProtocol,
+ WMPNetwork_get_receivedPackets,
+ WMPNetwork_get_lostPackets,
+ WMPNetwork_get_receptionQuality,
+ WMPNetwork_get_bufferingCount,
+ WMPNetwork_get_bufferingProgress,
+ WMPNetwork_get_bufferingTime,
+ WMPNetwork_put_bufferingTime,
+ WMPNetwork_get_frameRate,
+ WMPNetwork_get_maxBitRate,
+ WMPNetwork_get_bitRate,
+ WMPNetwork_getProxySettings,
+ WMPNetwork_setProxySettings,
+ WMPNetwork_getProxyName,
+ WMPNetwork_setProxyName,
+ WMPNetwork_getProxyPort,
+ WMPNetwork_setProxyPort,
+ WMPNetwork_getProxyExceptionList,
+ WMPNetwork_setProxyExceptionList,
+ WMPNetwork_getProxyBypassForLocal,
+ WMPNetwork_setProxyBypassForLocal,
+ WMPNetwork_get_maxBandwidth,
+ WMPNetwork_put_maxBandwidth,
+ WMPNetwork_get_downloadProgress,
+ WMPNetwork_get_encodedFrameRate,
+ WMPNetwork_get_framesSkipped,
+};
+
HRESULT init_player(WindowsMediaPlayer *wmp)
{
wmp->IWMPPlayer4_iface.lpVtbl = &WMPPlayer4Vtbl;
wmp->IWMPSettings_iface.lpVtbl = &WMPSettingsVtbl;
wmp->IWMPControls_iface.lpVtbl = &WMPControlsVtbl;
wmp->IWMPMedia_iface.lpVtbl = &WMPMediaVtbl;
+ wmp->IWMPNetwork_iface.lpVtbl = &WMPNetworkVtbl;
return S_OK;
}
diff --git a/dlls/wmp/wmp_private.h b/dlls/wmp/wmp_private.h
index ca5002f5c4..5b79fafa07 100644
--- a/dlls/wmp/wmp_private.h
+++ b/dlls/wmp/wmp_private.h
@@ -45,6 +45,7 @@ struct WindowsMediaPlayer {
IWMPControls IWMPControls_iface;
//For now there is only one IWMPMedia at a time
IWMPMedia IWMPMedia_iface;
+ IWMPNetwork IWMPNetwork_iface;
LONG ref;
--
2.15.1
Jan. 30, 2018
[PATCH 5/7] wmp: Add IWMPMedia stub
by Anton Romanov
Signed-off-by: Anton Romanov <theli.ua(a)gmail.com>
---
dlls/wmp/player.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++-
dlls/wmp/wmp_private.h | 2 +
2 files changed, 219 insertions(+), 2 deletions(-)
diff --git a/dlls/wmp/player.c b/dlls/wmp/player.c
index 430f701539..c15a79e2d0 100644
--- a/dlls/wmp/player.c
+++ b/dlls/wmp/player.c
@@ -24,6 +24,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(wmp);
static void update_state(WindowsMediaPlayer *wmp, int state);
+static inline WindowsMediaPlayer *impl_from_IWMPMedia(IWMPMedia *iface)
+{
+ return CONTAINING_RECORD(iface, WindowsMediaPlayer, IWMPMedia_iface);
+}
+
static inline WindowsMediaPlayer *impl_from_IWMPPlayer4(IWMPPlayer4 *iface)
{
return CONTAINING_RECORD(iface, WindowsMediaPlayer, IWMPPlayer4_iface);
@@ -145,8 +150,10 @@ static HRESULT WINAPI WMPPlayer4_get_settings(IWMPPlayer4 *iface, IWMPSettings *
static HRESULT WINAPI WMPPlayer4_get_currentMedia(IWMPPlayer4 *iface, IWMPMedia **ppMedia)
{
WindowsMediaPlayer *This = impl_from_IWMPPlayer4(iface);
- FIXME("(%p)->(%p)\n", This, ppMedia);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, ppMedia);
+ IWMPMedia_AddRef(&This->IWMPMedia_iface);
+ *ppMedia = &This->IWMPMedia_iface;
+ return S_OK;
}
static HRESULT WINAPI WMPPlayer4_put_currentMedia(IWMPPlayer4 *iface, IWMPMedia *pMedia)
@@ -865,10 +872,218 @@ static const IWMPControlsVtbl WMPControlsVtbl = {
WMPControls_playItem,
};
+HRESULT WINAPI WMPMedia_get_isIdentical(IWMPMedia *iface, IWMPMedia *other, VARIANT_BOOL *pvBool)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p, %p)\n", This, other, pvBool);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_get_sourceURL(IWMPMedia *iface, BSTR *pbstrName)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p)\n", This, pbstrName);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_get_name(IWMPMedia *iface, BSTR *pbstrName)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p)\n", This, pbstrName);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_put_name(IWMPMedia *iface, BSTR pbstrName)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pbstrName));
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_get_imageSourceWidth(IWMPMedia *iface, LONG *pWidth)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p)\n", This, pWidth);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_get_imageSourceHeight(IWMPMedia *iface, LONG *pHeight)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p)\n", This, pHeight);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_get_markerCount(IWMPMedia *iface, LONG* pMarkerCount)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p)\n", This, pMarkerCount);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_getMarkerTime(IWMPMedia *iface, LONG MarkerNum, DOUBLE *pMarkerTime)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%d, %p)\n", This, MarkerNum, pMarkerTime);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_getMarkerName(IWMPMedia *iface, LONG MarkerNum, BSTR *pbstrMarkerName)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%d, %p)\n", This, MarkerNum, pbstrMarkerName);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_get_duration(IWMPMedia *iface, DOUBLE *pDuration)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p)\n", This, pDuration);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_get_durationString(IWMPMedia *iface, BSTR *pbstrDuration)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p)\n", This, pbstrDuration);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_get_attributeCount(IWMPMedia *iface, LONG *plCount)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p)\n", This, plCount);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_getAttributeName(IWMPMedia *iface, LONG lIndex, BSTR *pbstrItemName)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%d, %p)\n", This, lIndex, pbstrItemName);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_getItemInfo(IWMPMedia *iface, BSTR bstrItemName, BSTR *pbstrVal)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%s, %p)\n", This, debugstr_w(bstrItemName), pbstrVal);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_setItemInfo(IWMPMedia *iface, BSTR bstrItemName, BSTR bstrVal)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%s, %s)\n", This, debugstr_w(bstrItemName), debugstr_w(bstrVal));
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_getItemInfoByAtom(IWMPMedia *iface, LONG lAtom, BSTR *pbstrVal)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%d, %p)\n", This, lAtom, pbstrVal);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_isMemberOf(IWMPMedia *iface, IWMPPlaylist *pPlaylist, VARIANT_BOOL *pvarfIsMemberOf)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p, %p)\n", This, pPlaylist, pvarfIsMemberOf);
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI WMPMedia_isReadOnlyItem(IWMPMedia *iface, BSTR bstrItemName, VARIANT_BOOL *pvarfIsReadOnly)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%s, %p)\n", This, debugstr_w(bstrItemName), pvarfIsReadOnly);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPMedia_QueryInterface(IWMPMedia *iface, REFIID riid, void **ppv)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ return IOleObject_QueryInterface(&This->IOleObject_iface, riid, ppv);
+}
+
+static ULONG WINAPI WMPMedia_AddRef(IWMPMedia *iface)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ return IOleObject_AddRef(&This->IOleObject_iface);
+}
+
+static ULONG WINAPI WMPMedia_Release(IWMPMedia *iface)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ return IOleObject_Release(&This->IOleObject_iface);
+}
+
+static HRESULT WINAPI WMPMedia_GetTypeInfoCount(IWMPMedia *iface, UINT *pctinfo)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%p)\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPMedia_GetTypeInfo(IWMPMedia *iface, UINT iTInfo,
+ LCID lcid, ITypeInfo **ppTInfo)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%u %d %p)\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPMedia_GetIDsOfNames(IWMPMedia *iface, REFIID riid,
+ LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%s %p %u %d %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI WMPMedia_Invoke(IWMPMedia *iface, DISPID dispIdMember,
+ REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ WindowsMediaPlayer *This = impl_from_IWMPMedia(iface);
+ FIXME("(%p)->(%d %s %d %x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), lcid,
+ wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+
+static const IWMPMediaVtbl WMPMediaVtbl = {
+ WMPMedia_QueryInterface,
+ WMPMedia_AddRef,
+ WMPMedia_Release,
+ WMPMedia_GetTypeInfoCount,
+ WMPMedia_GetTypeInfo,
+ WMPMedia_GetIDsOfNames,
+ WMPMedia_Invoke,
+ WMPMedia_get_isIdentical,
+ WMPMedia_get_sourceURL,
+ WMPMedia_get_name,
+ WMPMedia_put_name,
+ WMPMedia_get_imageSourceWidth,
+ WMPMedia_get_imageSourceHeight,
+ WMPMedia_get_markerCount,
+ WMPMedia_getMarkerTime,
+ WMPMedia_getMarkerName,
+ WMPMedia_get_duration,
+ WMPMedia_get_durationString,
+ WMPMedia_get_attributeCount,
+ WMPMedia_getAttributeName,
+ WMPMedia_getItemInfo,
+ WMPMedia_setItemInfo,
+ WMPMedia_getItemInfoByAtom,
+ WMPMedia_isMemberOf,
+ WMPMedia_isReadOnlyItem
+};
+
HRESULT init_player(WindowsMediaPlayer *wmp)
{
wmp->IWMPPlayer4_iface.lpVtbl = &WMPPlayer4Vtbl;
wmp->IWMPSettings_iface.lpVtbl = &WMPSettingsVtbl;
wmp->IWMPControls_iface.lpVtbl = &WMPControlsVtbl;
+ wmp->IWMPMedia_iface.lpVtbl = &WMPMediaVtbl;
+
return S_OK;
}
diff --git a/dlls/wmp/wmp_private.h b/dlls/wmp/wmp_private.h
index b047143b3e..ca5002f5c4 100644
--- a/dlls/wmp/wmp_private.h
+++ b/dlls/wmp/wmp_private.h
@@ -43,6 +43,8 @@ struct WindowsMediaPlayer {
IWMPPlayer4 IWMPPlayer4_iface;
IWMPSettings IWMPSettings_iface;
IWMPControls IWMPControls_iface;
+ //For now there is only one IWMPMedia at a time
+ IWMPMedia IWMPMedia_iface;
LONG ref;
--
2.15.1
Jan. 30, 2018