Купил себе простенький принтер всем доволен кроме одного при двухсторонней печати каждый раз появляется это окно и в настройках его не как не отрубить (по крайней мере я не нашел) вызывается это окно скорее всего через dll-ку (прикрепил) так как в экспорте та самая функция подскажите как лучше убить эту заразу достала уже
tester3000 Да есть там в настройках! Точно! На свежую голову посмотри. Иначе - этот вопрос решается бесплатно обслуживающим центром по гарантии. Неси его туда пока пол года не истекло.
_sheva740 Ну вроде все посмотрел нет вот только это есть Если отключить этот дуплекс то окно не появляется но и двухсторонняя печать не пашет Помогите найти где это окно вызывается и убить его ))
tester3000 Ну конечно нужно отключать дуплекс! Печатаешь с одной стороны - дуплекс отключи! Печатаешь с двух - включи! Это же не HP1320, он сам по себе бумагу не затянет а спросит у тебя. Так я не понял, у тебя HP1006 или HP1505 ?! Вполне бюджетненький и компактный принтерок за 120 dol. Там даже индикации не выведено. В целом для дома выбор неплохой, но правя dll-ки ты его интерфейс качественно не улучшишь )
_sheva740 У меня HP LaserJet 1505 но дрова используют эту dll (HP1006K.dll) Ну это все понятно НО при двухсторонней печати он мне каждый раз показывает эту инструкцию как правильно вытащить и втащить бумагу она меня зае... вот и хочу прибить это окошко я без него знаю как бумагу переворачивать =)) Индикация есть Да я особо и не стремлюсь все что я хочу это найти где там аля CreateWindow или тому подобное и тупо его занопить если бы был exe файл давно бы уже нашел а вот dll отлаживать как-то еще не приходилось
tester3000 Конечно можно искать окно по заголовку и послать ему WM_CLOSE, но программа может запросить пользователя о подтверждении, до разрушения окна. Все равно придется нажимать кнопку. ) Но мне кажется что опасно тупо гасить окно по заголовку с сообщением от той dll -ки. Почему? Ну а что ты будешь делать если в лотке бумага закончится а он не допечатает? Выпадет диалог с кнопкой "Перезапустить/Продолжить" задание? А иначе как без этого окна (ты же его разрушишь) "Продолжить" из диалога нажать ( Это же правильный и нужный диалог? Кнопок то на корпусе на нем нет.
Да попробуй через AutoIt скипт накатать. Или SignOfMisery На кнопку полюбому придется нажимать. Так что порядок действий такой: While(true) { Ждем окна с таким то заголовком и классом Ищем кнопку с такой то надписью Нажимаем ее }
Есть там кнопки и индикация диалога с перезапуском он и так не предлагает а вот за отсутствие бумаги уже из другой dll диалог вроде вызывается так что можно удалять эту инструкцию для секретарш лучше скажи где его вырубить в конце концов потом все обратно можно будет вернуть ))) punxer Да это не проблема накатать скрипт или на win api накатать прогу аля поиск окна и килл его либо клик кнопка но хочется разобраться мне как у этого принтера кишки устроены а конкретно где там происходит вызов этого окна и как то не охота чтобы этот скрипт или прога в памяти висела и постоянно искала это окно
tester3000 Ну я наверное просто смирился. Не все же такие упертые )) А если уж эту dll-ку править (при 100% уверенности что этот твой любимый диалог в ней!!), то наверное так: 1. Cпомощью утили dll2inc - посмотрел бы что там за функции экспортируются 2. Запустился бы Code (Text): .data LibName db "HP1006K.dll",0 FunctionName db "func_with_some_looks_like_a_CreateWindow",0 DllNotFound db "Cannot load library",0 FunctionNotFound db "func_with_some_looks_like_a_CreateWindow function not found",0 .data? hLib dd ? TestHelloAddr dd ? .code start: invoke LoadLibrary,addr LibName .if eax==NULL invoke StdOut,addr DllNotFound .else mov hLib,eax invoke GetProcAddress,hLib,addr FunctionName .if eax==NULL invoke StdOut,addr FunctionNotFound .else int 3 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<!!! call eax .endif invoke FreeLibrary,hLib .endif invoke ExitProcess,NULL end start 3. Выпал бы в Олли и уж там искал и нопил бы то что нужно 4. Плюнул бы на все это и сохранил документ на винте без распечатки ) благо винты дешевеют.
_sheva740 Code (Text): include '%fasminc%\win32axp.inc' .data LibName db "HP1006K.dll",0 FunctionName db "_DisplayManualDuplexDialog@16",0 hLib dd ? .code start: invoke LoadLibrary,LibName test eax,eax jz .exit mov [hLib],eax invoke GetProcAddress,[hLib],FunctionName jz .free int 3 ;<=== тут на bp меня кидает куда-то в дебри ntdll ; потом что-то пока для меня не понятное )) ; и Olly мну посылает =))) (Terminated) call eax ; сюды мне дверь уже закрыта)) .free: invoke FreeLibrary,[hLib] .exit: invoke ExitProcess,0 .end start Ну люблю я всякую макулатуру почитать на бумаге конечно можно купить в инете но до моего города цивилизация ввиде WebMoney и др. еще не дошла
занопить ничего не получется. продолжение печати вызывает нажатие кнопки на диалоге и простое его закрытие не продолжит печать, Попробуй закрыть окно найдя его по заголовку, если печать продолжится то, отлично и проблем нет, иначе придется править код этой функции, или код функции диалога и это будут отнюдь не нопы.
Code (Text): signed int __stdcall DialogFunc(HWND hWnd, int msg, int a3, int a4) { DWORD v4; // ebp@1 void *v6; // ebx@7 LPWSTR *v7; // esi@7 HMODULE v8; // eax@12 HANDLE v9; // edi@12 HMODULE v10; // esi@12 FARPROC v11; // eax@13 unsigned int v12; // esi@16 LONG v13; // eax@16 UINT v14; // ST10_4@17 HINSTANCE v15; // ST0C_4@17 HWND v16; // eax@18 unsigned int v17; // esi@21 int v18; // edx@22 int v19; // eax@22 int v20; // ecx@22 int v21; // ST0C_4@22 HANDLE hPrinter; // [sp+10h] [bp-4D4h]@1 DWORD pcReturned; // [sp+14h] [bp-4D0h]@7 DWORD pcbNeeded; // [sp+18h] [bp-4CCh]@7 int v25; // [sp+1Ch] [bp-4C8h]@7 struct _PRINTER_DEFAULTSW pDefault; // [sp+20h] [bp-4C4h]@7 LPARAM lParam; // [sp+2Ch] [bp-4B8h]@22 int v28; // [sp+3Ch] [bp-4A8h]@22 int v29; // [sp+40h] [bp-4A4h]@22 int v30; // [sp+48h] [bp-49Ch]@22 wchar_t v31; // [sp+54h] [bp-490h]@1 wchar_t v32; // [sp+6Ch] [bp-478h]@1 wchar_t v33; // [sp+70h] [bp-474h]@11 __int16 v34; // [sp+A0h] [bp-444h]@11 const wchar_t FileName[260]; // [sp+D4h] [bp-410h]@8 const WCHAR LibFileName; // [sp+2DCh] [bp-208h]@12 memcpy(&v31, L"P1006MAN.dll", 0x18u); v4 = 0; hPrinter = 0; v32 = aP1006man_dll[12]; if ( msg == WM_CLOSE ) { PostMessageW(hWnd, WM_COMMAND, 2u, 0); return 0; } if ( msg != WM_INITDIALOG ) { Code (Text): .text:6847AC90 ; signed int __stdcall DialogFunc(HWND hWnd, int msg, int a3, int a4) .text:6847AC90 DialogFunc proc near ; DATA XREF: DisplayManualDuplexDialog(x,x,x,x)+DBo .text:6847AC90 .text:6847AC90 hPrinter = dword ptr -4D4h .text:6847AC90 pcReturned = dword ptr -4D0h .text:6847AC90 pcbNeeded = dword ptr -4CCh .text:6847AC90 var_4C8 = dword ptr -4C8h .text:6847AC90 pDefault = _PRINTER_DEFAULTSW ptr -4C4h .text:6847AC90 lParam = dword ptr -4B8h .text:6847AC90 var_4A8 = dword ptr -4A8h .text:6847AC90 var_4A4 = dword ptr -4A4h .text:6847AC90 var_49C = dword ptr -49Ch .text:6847AC90 var_490 = word ptr -490h .text:6847AC90 var_474 = word ptr -474h .text:6847AC90 FileName = word ptr -410h .text:6847AC90 LibFileName = word ptr -208h .text:6847AC90 hWnd = dword ptr 4 .text:6847AC90 msg = dword ptr 8 .text:6847AC90 arg_8 = dword ptr 0Ch .text:6847AC90 arg_C = dword ptr 10h .text:6847AC90 .text:6847AC90 sub esp, 4D4h .text:6847AC96 mov eax, [esp+4D4h+msg] .text:6847AC9D push ebx .text:6847AC9E push ebp .text:6847AC9F push esi .text:6847ACA0 push edi .text:6847ACA1 mov ecx, 6 .text:6847ACA6 mov esi, offset aP1006man_dll ; "P1006MAN.dll" .text:6847ACAB lea edi, [esp+4E4h+var_490] .text:6847ACAF rep movsd .text:6847ACB1 xor ebp, ebp .text:6847ACB3 xor ebx, ebx .text:6847ACB5 sub eax, 10h .text:6847ACB8 mov [esp+4E4h+hPrinter], ebp .text:6847ACBC movsw .text:6847ACBE jz loc_6847AF9F .text:6847ACC4 sub eax, 100h .text:6847ACC9 jz loc_6847AEC3 .text:6847ACCF dec eax .text:6847ACD0 jnz loc_6847AFB5 .text:6847ACD6 mov eax, [esp+4E4h+arg_8] .text:6847ACDD dec eax .text:6847ACDE jz short loc_6847AD09 .text:6847ACE0 dec eax .text:6847ACE1 jnz loc_6847AFB5 .text:6847ACE7 .text:6847ACE7 loc_6847ACE7: ; CODE XREF: DialogFunc+204j .text:6847ACE7 ; DialogFunc+22Ej .text:6847ACE7 mov eax, [esp+4E4h+hWnd] .text:6847ACEE push 1 ; nResult .text:6847ACF0 push eax ; hDlg .text:6847ACF1 call ds:EndDialog в начало функции суем прыжок на loc_6847ACE7:
tester3000 то есть нужно ее на принтере жать полюбому??? тогда пусть этот диалог появится, смотри какому процессу он принадлежит и аттачся Olly, IDA... Там и увидишь кроссреференсы на функцию или брейки поставишь
punxer Да на принтере жать нужно если кнопку продолжить в окне нажать просто окно закроется Мм.. ну я это первым делом и сделал процесс называется run32.dll и в качестве параметра ему передается C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\HP1006K.dll ее экспорт на 2 скрине сверху run32.dll - это я так понял системная либа которая и запускает эту dll
punxer Code (Text): .text:6847AC90 sub esp, 4D4h ; заменил на jmp 6847ACE7 Диалог вроде прибили а вот программа (любая где есть печать) из которой вызываем печать после распечатки жестко виснет приходится процесс килять