[PATCH] wmvcore/tests: Access IWMDRMReader(|2|3) interfaces on Windows.

Jefferson Carpenter jeffersoncarpenter2 at gmail.com
Tue Oct 24 00:36:47 CDT 2017


Unsure if this patch is appropriate for the Wine project or not.
Thought I would submit it just in case.

By modifying a particular memory location relative to the IWMReader
returned by WMCreateReader, one can cause it to return IWMDRMReader
interfaces.

(Normally IWMDRMReader interfaces can be accessed by linking against
wmstubdrm.lib instead of against wmvcore.lib, according to MS.  As yet I
do not know exactly what the differences are, just that setting these
memory locations has the aforementioned effect.)

Ran tests in 32- and 64-bit wine build directories, and ran 32- and
64-bit crosstests on Windows 7 x64.

Signed-off-by: Jefferson Carpenter <jeffersoncarpenter2 at gmail.com>
---
 dlls/wmvcore/tests/wmvcore.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index b11a5bf7dea..3fb5cf702ea 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -84,6 +84,15 @@ static void test_wmreader_interfaces(void)
     IWMReaderPlaylistBurn *playlist;
     IWMLanguageList       *langlist;
     IReferenceClock       *refclock;
+#if defined(__MINGW32__) || defined(__MINGW64__)
+#ifdef _WIN64
+    unsigned long long flagPtrAddr;
+    unsigned char      flagMem[557];
+#elif _WIN32
+    unsigned int       flagPtrAddr;
+    unsigned char      flagMem[289];
+#endif
+#endif
 
     hr = WMCreateReader( NULL, 0, &reader );
     ok(hr == S_OK, "WMCreateReader failed 0x%08x\n", hr);
@@ -159,6 +168,26 @@ static void test_wmreader_interfaces(void)
     hr = IWMReader_QueryInterface(reader, &IID_IReferenceClock, (void **)&refclock);
     ok(hr == S_OK, "Failed 0x%08x\n", hr);
 
+#if defined(__MINGW32__) || defined(__MINGW64__)
+#ifdef _WIN64
+    flagPtrAddr = (unsigned long long)(reader) - 24;
+    flagMem[556] = 1;
+#elif _WIN32
+    flagPtrAddr = (unsigned int)(reader) - 12;
+    flagMem[288] = 1;
+#endif
+    *(unsigned char **)flagPtrAddr = flagMem;
+#endif
+
+    hr = IWMReader_QueryInterface(reader, &IID_IWMDRMReader, (void **)&drmreader);
+    todo_wine ok(hr == S_OK, "Failed 0x%08x\n", hr);
+
+    hr = IWMReader_QueryInterface(reader, &IID_IWMDRMReader2, (void **)&drmreader2);
+    todo_wine ok(hr == S_OK, "Failed 0x%08x\n", hr);
+
+    hr = IWMReader_QueryInterface(reader, &IID_IWMDRMReader3, (void **)&drmreader3);
+    todo_wine ok(hr == S_OK, "Failed 0x%08x\n", hr);
+
     if(packet)
         IWMPacketSize_Release(packet);
     if(packet2)
-- 
2.11.0




More information about the wine-patches mailing list