Bug 3146

Summary: Печать из программы Налогоплательщик ЮЛ
Product: WINE@Etersoft Reporter: Семенов Александр Алексеевич <saa>
Component: Печать ; Диалог печатиAssignee: Виталий Перов <vitperov>
Status: CLOSED FIXED QA Contact: Денис Баранов <baraka>
Severity: critical    
Priority: P2 CC: baraka, kondratyuk, lav
Version: 1.0.10Keywords: TO_WINEHQ
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: 10141,10147 Связано с:
Дата напоминания:
Bug Depends on: 3084, 3301    
Bug Blocks: 443, 3962, 6009    

Description Семенов Александр Алексеевич 2008-12-19 17:14:40 MSK
При печати отчетов из программы Налогоплательщик ЮЛ 4.14 (http://www.gnivc.ru/Default.aspx?id=20) не печатаются страницы далее третьей. То есть, если в отчете три страницы - все в порядке, если в отчете больше трех страниц, то печатаются три страницы, при выводе на печать четвертой все зависает.

fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4117) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4119) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4120) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4117) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4119) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4120) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4117) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4119) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4120) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4117) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4119) - not supported. fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(4120) - not supported.
wine: Unhandled page fault on read access to 0x00000000 at address 0x5164f04 
(thread 0037), starting debugger...
WineDbg starting on pid 0028
Unhandled exception: page fault on read access to 0x00000000 in 32-bit code 
(0x05164f04).
Register dump:
 CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:003b
 EIP:05164f04 ESP:00348584 EBP:00000000 EFLAGS:00210246(   - 00      -RIZP1)
 EAX:00000000 EBX:003485d4 ECX:003470e4 EDX:001c01f2  ESI:003470e4 EDI:00000086 Stack dump:
0x00348584:  00000000 00000086 00000000 001c01f2
0x00348594:  003485d4 00000000 00360084 00000086
0x003485a4:  003485fc 7ec2bf30 00000000 00000086
0x003485b4:  00000000 001c01f2 00000000 00000000
0x003485c4:  00000000 00000024 00000001 7ec072da
0x003485d4:  003470e4 00347120 00000000 001c01f2
Backtrace:
=>1 0x05164f04 in gnivcpdoc (+0x4f04) (0x00000000)
0x05164f04: call        *0x0(%ebp)
Wine-dbg>
Comment 1 Виталий Перов 2009-01-19 18:09:51 MSK
Версия 4.13
Итересно то, что в текущей версии ветки eterhack это программа вообще не работает:
появляются бесконечные сообщения о невозможности записи в файлы, и о несуществовании переменных.

В "чистом" wine  и в wine из репозитория eterwine программа работает. Пробовал печатать на тестовый (виртуальный) принтер. Печать 5 страниц проходит без проблем.

Версия 4.14
Не работает даже в "чистом" wine.

Думаю это уже отдельная бага
Comment 2 Виталий Перов 2009-01-19 18:17:38 MSK
Завёл отдельную багу (#3301)
Comment 3 Виталий Перов 2009-02-27 17:31:07 MSK
После нажатие на "Печать" появляется сообщение "При печати произошла неизвестная ошибка"
Comment 4 Виталий Перов 2009-02-27 17:54:57 MSK
Трейс по каналам wineps,psdrv,commdlg даёт только:

trace:commdlg:PrintDlgA (0x245ead0): hwndOwner = 0x20040, hDevMode = (nil), hDevNames = (nil)
pp. 0-0, min p 0, max p 0, copies 0, hinst (nil)
flags 0014010c (PD_NOSELECTION PD_NOPAGENUMS PD_RETURNDC PD_USEDEVMODECOPIES[ANDCOLLATE] PD_HIDEPRINTTOFILE )

trace:commdlg:PRINTDLG_WMCommandA  OK button was hit
Comment 5 Виталий Перов 2009-05-22 17:09:31 MSD
Проверил. Комманда PSDRV_StartDoc не вызывается.
Предположительно бага в диалоге печати
Comment 6 Виталий Перов 2009-05-22 17:28:40 MSD
Отладчик паказывает падение:
0x7e5f2a36 PRINTDLG_WMCommandA+0x916 in comdlg32: movzwl        0x4(%esi),%eax
Wine-dbg>First chance exception: page fault on read access to 0x00000004 in 32-bit code (0x7e5f2a36).

Backtrace:
=>0 0x7e5f2a36 PRINTDLG_WMCommandA+0x916() in comdlg32 (0x003289f4)
  1 0x7e5f380f in comdlg32 (+0x2380f) (0x00328b44)
  2 0x7ed3cbea WINPROC_wrapper+0x1a() in user32 (0x00328b74)
  3 0x7ed3deae in user32 (+0xadeae) (0x00328bd4)
  4 0x7ed40d32 in user32 (+0xb0d32) (0x00328c24)
  5 0x7ecc52f3 DefDlgProcA+0x83() in user32 (0x00328c74)
  6 0x7ed3cbea WINPROC_wrapper+0x1a() in user32 (0x00328ca4)
  7 0x7ed3e15d in user32 (+0xae15d) (0x00328cf4)
  8 0x7ed40e73 CallWindowProcA+0xa3() in user32 (0x00328d64)
  9 0x1002e7e0 in seon (+0x2e7e0) (0x00328d84)
  10 0x1002deae in seon (+0x2deae) (0x00328db0)
  11 0x100307be in seon (+0x307be) (0x00328de0)
  12 0x1003139b in seon (+0x3139b) (0x00328e04)
  13 0x1002f29d in seon (+0x2f29d) (0x00328e54)
  14 0x1002ecdc in seon (+0x2ecdc) (0x00328ed0)
  15 0x1002ec8e in seon (+0x2ec8e) (0x00328ef0)
  16 0x1002ddf1 in seon (+0x2ddf1) (0x00328f50)
  17 0x1002dff9 in seon (+0x2dff9) (0x00328f6c)
  18 0x7ed3cbea WINPROC_wrapper+0x1a() in user32 (0x00328f9c)
  19 0x7ed3e15d in user32 (+0xae15d) (0x00328fec)
  20 0x7ed3cfca WINPROC_wrapper+0x3fa() in user32 (0x003294bc)
  21 0x7ed412b3 in user32 (+0xb12b3) (0x0032950c)
  22 0x7ecffe51 in user32 (+0x6fe51) (0x0032956c)
  23 0x7ed05076 in user32 (+0x75076) (0x003295ec)
  24 0x7ed0551c SendMessageW+0x4c() in user32 (0x0032963c)
  25 0x7ecaaa56 in user32 (+0x1aa56) (0x0032971c)
  26 0x7ecab5ac in user32 (+0x1b5ac) (0x0032973c)
  27 0x7ed3cbea WINPROC_wrapper+0x1a() in user32 (0x0032976c)
  28 0x7ed3e15d in user32 (+0xae15d) (0x003297bc)
  29 0x7ed4121b in user32 (+0xb121b) (0x0032980c)
  30 0x7ecfff76 DispatchMessageW+0x96() in user32 (0x0032985c)
  31 0x7ecc9e89 IsDialogMessageW+0x119() in user32 (0x003299fc)
  32 0x7ecca7f4 in user32 (+0x3a7f4) (0x00329a6c)
  33 0x7ecccb72 DialogBoxIndirectParamAorW+0x52() in user32 (0x00329a9c)
  34 0x7ecccc11 DialogBoxIndirectParamA+0x41() in user32 (0x00329acc)
  35 0x7e5f7160 PrintDlgA+0x310() in comdlg32 (0x00329f4c)
  36 0x1002bc40 in seon (+0x2bc40) (0x022755a8)
  37 0x00000006 (0x1003f584)
  38 0x100106e0 in seon (+0x106e0) (0x10010400)
  39 0x9090c310 (0x03e858b8)
  40 0x00000000 (0x00000000)
Comment 7 Виталий Перов 2009-05-22 19:33:07 MSD
то же самое, но с отладкой:

Backtrace:
=>0 0x7e60c471 PRINTDLG_WMCommandA+0x90d(hDlg=0x10094, wParam=1, lParam=262290, PrintStructures=0x192f38) [/srv/vitperov/Projects/wine-dev/dlls/comdlg32/printdlg.c:435] in comdlg32 (0x00328bd4)
  1 0x7e60cd3c PrintDlgProcA+0x9c(hDlg=0x10094, uMsg=273, wParam=1, lParam=262290) [/srv/vitperov/Projects/wine-dev/dlls/comdlg32/printdlg.c:1873] in comdlg32 (0x00328cf4)
fixme:dbghelp_dwarf:dwarf2_parse_variable Unsupported form for const value System (a)
  2 0x7ed3d59a WINPROC_wrapper+0x1a() in user32 (0x00328d24)
  3 0x7ed3d81d call_dialog_proc+0x65(hwnd=<register EDI not in topmost frame>, msg=273, wp=1, lp=262290, result=0x328da4, arg=0x7e60cca0) [/srv/vitperov/Projects/wine-dev/dlls/user32/winproc.c:482] in user32 (0x00328d64)
  4 0x7ed4245f WINPROC_CallDlgProcA+0x54(func=0xffff0039, hwnd=<register EDI not in topmost frame>, msg=273, wParam=1, lParam=262290) [/srv/vitperov/Projects/wine-dev/dlls/user32/winproc.c:2402] in user32 (0x00328db4)
  5 0x7ecca4f2 DefDlgProcA+0x7d(hwnd=<register ESI not in topmost frame>, msg=<register EDI not in topmost frame>, wParam=1, lParam=262290) [/srv/vitperov/Projects/wine-dev/dlls/user32/defdlg.c:443] in user32 (0x00328de4)
  6 0x7ed3d59a WINPROC_wrapper+0x1a() in user32 (0x00328e14)
  7 0x7ed3d97f call_window_proc+0x61(hwnd=<register EDI not in topmost frame>, msg=<register ESI not in topmost frame>, wp=1, lp=262290, result=0x328ea0, arg=0x7ecca475) [/srv/vitperov/Projects/wine-dev/dlls/user32/winproc.c:461] in user32 (0x00328e54)
  8 0x7ed426a0 CallWindowProcA+0x118(func=<is not available>, hwnd=0x10094, msg=273, wParam=1, lParam=262290) [/srv/vitperov/Projects/wine-dev/dlls/user32/winproc.c:2324] in user32 (0x00328ec4)
  9 0x1002e7e0 in seon (+0x2e7e0) (0x00328ee4)
  10 0x1002deae in seon (+0x2deae) (0x00328f10)
  11 0x100307be in seon (+0x307be) (0x00328f40)
  12 0x1003139b in seon (+0x3139b) (0x00328f64)
  13 0x1002f29d in seon (+0x2f29d) (0x00328fb4)
  14 0x1002ecdc in seon (+0x2ecdc) (0x00329030)
  15 0x1002ec8e in seon (+0x2ec8e) (0x00329050)
  16 0x1002ddf1 in seon (+0x2ddf1) (0x003290b0)
  17 0x1002dff9 in seon (+0x2dff9) (0x003290cc)
  18 0x7ed3d59a WINPROC_wrapper+0x1a() in user32 (0x003290fc)
  19 0x7ed3d97f call_window_proc+0x61(hwnd=<register EDI not in topmost frame>, msg=<register ESI not in topmost frame>, wp=1, lp=262290, result=0x3296b0, arg=0x1002dfce) [/srv/vitperov/Projects/wine-dev/dlls/user32/winproc.c:461] in user32 (0x0032913c)
  20 0x7ed405f6 WINPROC_CallProcWtoA+0x196(callback=0x7ed3d91e, hwnd=0x10094, msg=273, wParam=1, lParam=262290, result=0x3296b0, arg=0x1002dfce) [/srv/vitperov/Projects/wine-dev/dlls/user32/winproc.c:1276] in user32 (0x0032961c)
  21 0x7ed42a64 WINPROC_call_window+0x183(hwnd=<register EDI not in topmost frame>, msg=273, wParam=1, lParam=262290, result=0x3296b0, unicode=1, mapping=WMCHAR_MAP_SENDMESSAGE) [/srv/vitperov/Projects/wine-dev/dlls/user32/winproc.c:2213] in user32 (0x0032965c)
  22 0x7ed0332a call_window_proc+0x8e(hwnd=<register ESI not in topmost frame>, msg=<register EDI not in topmost frame>, wparam=1, lparam=262290, unicode=1, same_thread=1, mapping=WMCHAR_MAP_SENDMESSAGE) [/srv/vitperov/Projects/wine-dev/dlls/user32/message.c:1642] in user32 (0x003296bc)
  23 0x7ed08917 send_message+0x1bd(info=<register EDI not in topmost frame>, res_ptr=0x329758, unicode=1) [/srv/vitperov/Projects/wine-dev/dlls/user32/message.c:2502] in user32 (0x0032971c)
  24 0x7ed08dd6 SendMessageW+0x4c(hwnd=0x10094, msg=273, wparam=1, lparam=262290) [/srv/vitperov/Projects/wine-dev/dlls/user32/message.c:2625] in user32 (0x0032975c)
  25 0x7ecb06d4 ButtonWndProc_common+0x72f(hWnd=0x40092, uMsg=<is not available>, wParam=0, lParam=524307, unicode=1) [/srv/vitperov/Projects/wine-dev/dlls/user32/button.c:435] in user32 (0x0032982c)
  26 0x7ecb1415 ButtonWndProcW+0x46(hWnd=<register ESI not in topmost frame>, uMsg=514, wParam=0, lParam=524307) [/srv/vitperov/Projects/wine-dev/dlls/user32/button.c:555] in user32 (0x0032984c)
  27 0x7ed3d59a WINPROC_wrapper+0x1a() in user32 (0x0032987c)
  28 0x7ed3d97f call_window_proc+0x61(hwnd=<register EDI not in topmost frame>, msg=<register ESI not in topmost frame>, wp=0, lp=524307, result=0x32992c, arg=0x7ecb13cf) [/srv/vitperov/Projects/wine-dev/dlls/user32/winproc.c:461] in user32 (0x003298bc)
  29 0x7ed429ce WINPROC_call_window+0xed(hwnd=<register EDI not in topmost frame>, msg=514, wParam=0, lParam=524307, result=0x32992c, unicode=1, mapping=WMCHAR_MAP_DISPATCHMESSAGE) [/srv/vitperov/Projects/wine-dev/dlls/user32/winproc.c:2226] in user32 (0x003298fc)
  30 0x7ed0344a DispatchMessageW+0x96(msg=<register EDI not in topmost frame>) [/srv/vitperov/Projects/wine-dev/dlls/user32/message.c:3145] in user32 (0x0032993c)
  31 0x7ecd1223 IsDialogMessageW+0x116(hwndDlg=<register ESI not in topmost frame>, msg=0x329af4) [/srv/vitperov/Projects/wine-dev/dlls/user32/dialog.c:1256] in user32 (0x00329abc)
  32 0x7ecd1b01 DIALOG_DoDialogBox+0x119(hwnd=<register EDI not in topmost frame>, owner=0x20048) [/srv/vitperov/Projects/wine-dev/dlls/user32/dialog.c:813] in user32 (0x00329b1c)
  33 0x7ecd1c0c DialogBoxIndirectParamAorW+0x52(hInstance=0xc000000, template=0x7e640038, owner=<register ESI not in topmost frame>, dlgProc=0x7e60cca0, param=1650488, flags=2) [/srv/vitperov/Projects/wine-dev/dlls/user32/dialog.c:874] in user32 (0x00329b3c)
  34 0x7ecd1ca0 DialogBoxIndirectParamA+0x41(hInstance=0xc000000, template=0x7e640038, owner=0x20048, dlgProc=0x7e60cca0, param=1650488) [/srv/vitperov/Projects/wine-dev/dlls/user32/dialog.c:882] in user32 (0x00329b6c)
  35 0x7e60a01f PrintDlgA+0x320(lppd=0x3862330) [/srv/vitperov/Projects/wine-dev/dlls/comdlg32/printdlg.c:2165] in comdlg32 (0x00329fec)
  36 0x1002bc40 in seon (+0x2bc40) (0x02275608)
  37 0x00000006 (0x1003f584)
  38 0x100106e0 in seon (+0x106e0) (0x10010400)
  39 0x9090c310 (0x03e858b8)
  40 0x00000000 (0x00000000)
Comment 8 Виталий Перов 2009-05-22 19:36:01 MSD
Строка, вызывающая ошибку:
0x7e60c471 PRINTDLG_WMCommandA+0x90d [/srv/vitperov/Projects/wine-dev/dlls/comdlg32/printdlg.c:435] in comdlg32: movzwl 0x4(%esi),%eax
435             copiesSupported = DeviceCapabilitiesA(devname,portname,DC_COPIES,NULL,dm);
Comment 9 Виталий Перов 2009-05-22 20:37:08 MSD
странно. Без отладчика ошибка возникает уже на строке:
devname	= ((char*)dn)+dn->wDeviceOffset;

При дальнейшем рассмотрении оказалось, что переменные lppd->hDevNames и lppd->hDevMode равны нулю.

При проверке на ноль данных значений всё начинает работать.
Но данный кусок кода отвечает за дуплексную печать.

Сейчас бага решена, но дуплексная печать в Налогоплательщике работать не будет.
Можно попробовать найти причину почему передаются нулевые структуры (исли эта причина не в самом Налогоплательщике)
Comment 10 Виталий Перов 2009-05-22 21:13:24 MSD
место вызова PRINTDLG_UpdatePrintDlgA- строка 2168 функции PrintDlgA

Странно, но PRINTDLG_CreateDevNames вызывается только после вызова самого диалога.
Возможно донная структура остаётся после предыдущего выбранного принтера, и будет ошибкой вызывать её там, где она сейчас вызывается.

Надо проверить что происходит в 1С
Comment 11 Виталий Перов 2009-05-22 21:40:41 MSD
Проверил. Разница между Налогопл. и 1С следующая:

В 1с PrintDlgA вызывается 2 раза:
fixme:commdlg:PrintDlgA lppd->hDevMode=(nil), lppd->hDevNames=(nil)
fixme:commdlg:PrintDlgA lppd->hDevMode=0x7da85fa, lppd->hDevNames=0x3b466b2

и второй раз с заполненными структурами,
а в Налогоплательщике только 1 раз 
fixme:commdlg:PrintDlgA lppd->hDevMode=(nil), lppd->hDevNames=(nil)
Comment 12 Виталий Перов 2009-05-22 22:21:28 MSD
Да, теперь я вижу, что предыдущий патч сделан неправильно: берутся старые параметры устройства.

Можно попробовать получать их из структуры:
LPPRINTER_INFO_2A pi = PrintStructures->lpPrinterInfo;
Comment 13 Виталий Перов 2009-05-24 15:22:39 MSD
Откатил предыдущий неверный коммит

commit 0da85e9a4a9e5f1131aeb473d77659ca749c5b4f
Author: Vitaly Perov <vitperov@etersoft.ru>
Date:   Mon May 26 15:43:41 2008 +0400

    [BUGFIX] comdlg32->printdlg.c: FIXES BUG 1686; Pages are printed incorrecly in duplex mode

Сделал патч. Приложил в eterwine.

Comment 14 Денис Баранов 2010-04-15 09:50:43 MSD
WINE@Etersoft 1.0.12 eter5/eter4
Приянто.