[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