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

Jefferson Carpenter <[email protected]>
Newsgroups gmane.comp.emulators.wine.patches
Message-ID <[email protected]>
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 <[email protected]>
---
 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.