[Bug 26459] Dragon Age: Origins DVD authenticity checks fail (IOCTL_DVD_READ_STRUCTURE fails, structures in "ntddcdvd.h" need to be byte packed with no padding)
wine-bugs at winehq.org
wine-bugs at winehq.org
Sat Jan 21 05:22:10 CST 2012
http://bugs.winehq.org/show_bug.cgi?id=26459
Anastasius Focht <focht at gmx.net> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |obfuscation
CC| |focht at gmx.net
Summary|Dragon Age: Origins doesn't |Dragon Age: Origins DVD
|recognize dvd? |authenticity checks fail
| |(IOCTL_DVD_READ_STRUCTURE
| |fails, structures in
| |"ntddcdvd.h" need to be
| |byte packed with no
| |padding)
--- Comment #4 from Anastasius Focht <focht at gmx.net> 2012-01-21 05:22:10 CST ---
Hello,
bought the game for a few bucks to look into it ;-)
It seems there is a problem with packing size of structures.
While verifying the authenticity of original DVD, the game loader tries to
retrieve the DvdPhysicalDescriptor using IOCTL_DVD_READ_STRUCTURE.
--- snip ---
0009:Call
KERNEL32.DeviceIoControl(0000009c,00335140,0032e510,00000011,36518b90,00000804,0032e4f8,00000000)
ret=00453065
0009:trace:cdrom:CDROM_DeviceIoControl 0x9c IOCTL_DVD_READ_STRUCTURE 0x32e510
17 0x36518b90 2052 0x32e400
0009:trace:cdrom:CDROM_Open 0, 6
0009:Ret KERNEL32.DeviceIoControl() retval=00000000 ret=00453065
...
0029:Call user32.MessageBoxW(00000000,00aa8328 L"Failed to authenticate the
disk. Please insert the correct disk and try again.",00aa83c8 L"Dragon Age:
Origins",00000010) ret=004023dc
--- snip ---
Winedbg:
--- snip ---
=>0 0x7bc3247a CDROM_DeviceIoControl(hDevice=0x80, hEvent=0x0(nil),
UserApcRoutine=(nil), UserApcContext=0x0(nil), piosb=0x33e49c,
dwIoControlCode=0x335140, lpInBuffer=0x33e510, nInBufferSize=0x11,
lpOutBuffer=0x36518b90, nOutBufferSize=0x804)
[/home/focht/projects/wine/wine-git/dlls/ntdll/cdrom.c:2810] in ntdll
(0x0033e464)
1 0x7b84011d DeviceIoControl+0x2fe(hDevice=0x80, dwIoControlCode=0x335140,
lpvInBuffer=0x33e510, cbInBuffer=0x11, lpvOutBuffer=0x36518b90,
cbOutBuffer=0x804, lpcbBytesReturned=0x33e4f8, lpOverlapped=(nil))
[/home/focht/projects/wine/wine-git/dlls/kernel32/file.c:2423] in kernel32
(0x0033e4c4)
...
3093 sz = sizeof(DVD_LAYER_DESCRIPTOR);
Wine-dbg>n
3094 if (lpInBuffer == NULL || nInBufferSize !=
sizeof(DVD_READ_STRUCTURE)) status = STATUS_INVALID_PARAMETER;
--- snip ---
The app passes 17 for DVD_LAYER_DESCRIPTOR structure size.
Due to default structure padding/member alignment, Wine's
"sizeof(DVD_LAYER_DESCRIPTOR)" will be larger hence the ioctl gets rejected.
Source:
http://source.winehq.org/git/wine.git/blob/750e7e072cd8bb36921545cb2beea9a6ce6350dc:/include/ddk/ntddcdvd.h
All structures in "ntddcdvd.h" need to be byte packed with no padding (#include
<pshpack1.h> [...] #include <poppack.h>).
Though with that fix and IOCTL_DVD_READ_STRUCTURE actually returning data it
still doesn't pass the game authenticity checks due to other bugs.
I'll file them as separate bugs.
Regards
--
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.
More information about the wine-bugs
mailing list