Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я думаю, что автор статьи ошибся, так как сделал анализ кода не с той стороны.
Если посмотреть сo стороны ntdll.dll, то увидим такое:

Код:
signed __int64 __fastcall LdrLoadDll(__int64 a1, _DWORD *a2, __int64 a3, _QWORD *a4)
{
    __int64 v5;
    __int64 v7;
    
    v7 = a1;
    v5 = a3;
    ...
    if ( !(LdrpPolicyBits & 4) && (v7 & 0x401) == 0x401 )
        return 0xC000000D;
    ...
     LdrpInitializeDllPath(*(_QWORD *)(v5 + 8), v7, &v19);
     v14 = LdrpLoadDll(v5, &v19, v13, &v18, v16, v17);
    ...
}

 
 
Как видим, в ф-ю с характерным именем LdrpInitializeDllPath отдается первый и третий аргументы (path и DllName), а её выходное значение v19 отдаётся в LdrpLoadDll(). Напрашивается вывод, что LdrpInitializeDllPath суммирует путь к длл и название длл, а LdrpLoadDll() загружает именно эту длл, а не делает стандартный поиск по текущей директории, \system32, \Windows, итд.
 
Адресное пространство процесса начинается с 0х10000, соответственно, адрес строки не может быть меньше этого значения.
Я уже давно начал замечать, что эти (и не только эти) свободные биты (0хffff) кодеры начали использовать для передачи информации. В этом случае для дополнительных флагов (0x401), которые скорее всего как-то влияют на LdrpPolicy.
 
В связи с этими двумя наблюдениями я думаю, что первый аргумент всё-таки PWSTR DllPath, a автор перепутал дополнительные флаги с DllCharacteristics.
 
 

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 01:43 02-11-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
 
играюсь тут с SetWindowsHookEx.  
если делаю 32-битные ехе+длл - в 32-битной оси всё отлично, но в 64 битной не работает вообще...
если делаю 64-битные ехе+длл - в 64-битной оси всё отлично, но 32-битные приложения мимо...
как сделать 2в1, чтоб не плавить мозги себе и юзерам?

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 14:26 15-11-2019
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127
 
а на чём исполняешь?

Всего записей: 24052 | Зарегистр. 06-12-2002 | Отправлено: 20:08 15-11-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
на чистом си, а какая разница? 32-битка - MSVC 6, 64-битка - MSVC 8

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 20:59 15-11-2019
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127
Делать экзешник другой разрядности (который будет ставить свой хук) и запускать его из основного. Хотя если ставить одинаковые хуки для обеих разрядностей, всё равно не факт, что заработает.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 21:00 15-11-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
понятно....  
а что значит - "одинаковые хуки для обеих разрядностей"?  
как они смогут быть разными?  
ведь алгоритм то они должны делать один и тот же...  
или речь была о том, что экспортируемые функи в дллшках должны зваться по разному?

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 22:08 15-11-2019
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
на чистом си, а какая разница?
ну, например, на интелах у меня были проблемы, пока они не сделали генерёж под "платформу" "ia32 on intel64"

Всего записей: 24052 | Зарегистр. 06-12-2002 | Отправлено: 22:41 15-11-2019
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127

Цитата:
а что значит - "одинаковые хуки для обеих разрядностей"?  
как они смогут быть разными?  
ведь алгоритм то они должны делать один и тот же...  

Да вот так. Можете взглянуть, как сделано в реальном проекте. Там движения мышки ловятся через хук WH_GETMESSAGE для 64-битных процессов и через WH_MOUSE для 32-битных. Потому как одинаковые хуки вместе работать отказывались наотрез, наплевав на утверждения MSDN, что работать должны.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 23:16 15-11-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http://ipic.su/img/img7/fs/20191118001.1574083566.png
как, имея хеднл 40514, добраться до 10644, не перепутав его с 10642 (которое постоянно лезет вместо нужного) и с 3086Е и прочими дочками 1505А4?  
    FindWindowEx( тут40514, NULL, "MKSEmbedded", "MKSWindow#0");
почему то дает НУЛЛ...
 
=====
 
уже не надо... допёр сам - без перечисления и цикла - никак.

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 16:35 18-11-2019 | Исправлено: MERCURY127, 20:33 18-11-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
опять вопрос...  
 
    if( HCBT_SYSCOMMAND ==nCode){
        if( SC_CLOSE ==(wParam & 0xFFF0)){
            MessageBox( NULL, "Closing is not allowed!", "Hooked!", MB_ICONINFORMATION);
            return 1;
        }// if
    }else if( ...
 
это для примера. это все у меня работает, даже совместно х64 и х32 хуки (идентичные) тоже спокойно пашут, строго в соответствии со сказками МС, вероятно, в силу примитивности кода и неиспользования всяких глючных фреймворков...
 
так вот, только что внезапно выяснилось, что приведённый код прекрасно работает со всеми окнами, КРОМЕ гостевого окна ВиртуалБокса, вот этого:  
   
 
но прекрасно работает с этим:
   
 
но это последнее мне как раз не нужно... мне нужно отработать первое окно... а с ним  выходит такое впечатление, что на него вообще никакие хуки невозможно установить.
как его побороть? попытаться работать не с HCBT?
 
(на самом деле дело в том, что я добавляю свой пункт в меню окна, который, если это виртмашина или эмулятор - пытается полуразвернуть окно, вписав его в рабочий стол с правильным аспектом гостя 4:3. граблей было много, но вот с этой я прям не знаю, что делать...)

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 16:24 22-11-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в общем, я так понял, это у бокса специально так сделано, невозможность инъекции длл - такая защита от суперзлобных гиперхацкеров...  
защита, конечно, замечательная, но мне то, нищему быдлокодеру, чего с ней делать?

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 21:28 08-12-2019
Collapse Troll

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Извините что оффтоп, но может вы умеете в "пересобрать драйверы"..
 
Нельзя ли как-то заставить работать камеру 'Logitech c170' под Windows 2019? на Win 2012 R2 я раньше умудрялся (ставил через driver update, и т.п.)
 
А тут просто задача-неберучка. Микрофон сразу и без драйверов работает, а камера труп.. Как понимаю драйвера не предназначались для этой ОС вовсе (как и для Win Server 2012 R2), но мне кажется что должны же они работать?
 
вот тут частично отписывал про свои "попытки":
http://gallery.ru-board.com/topic.cgi?forum=81&topic=0147&start=1420#20
 
Hardware Ids":
 
Цитата:

Цитата:
USB\VID_046D&PID_082B&REV_2825&MI_00
USB\VID_046D&PID_082B&MI_00
 
 
 
Могу выложить те дрова что у меня есть в облако
https://cloud.mail.ru/public/2DMT/wjEv8YMym
 
Может можно что-то с этим сделать?
если в результате хоть ваших подсказок оно заработает то готов перекинуть на пиво)

Всего записей: 790 | Зарегистр. 05-08-2006 | Отправлено: 11:17 25-03-2020
m00slim25



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос не совсем по теме, но м.б. просто кто то в курсе:
В WinXP/Win7/Win10 (до версии 1607 включительно) было возможно добавить ttf-шрифт в раздел реестра HKLM\Software\Microsoft\Windows NT\Console\TrueTypeFonts, и при открытии любого консольного окна этот шрифт сразу отображался в окне настроек консольного окна.
Начиная с Win10 версии 1703, как известно, весь Registry API выделен в отдельный процесс, и теперь этот трюк не работает - нужно перезапускать всю сессию, чтобы изменения вступили в силу.
И, вот, сам вопрос:
Какие нужно сделать телодвижения, чтобы изменения списка консольных шрифтов вступили в силу в текущей сессии немедленно?

Всего записей: 1039 | Зарегистр. 30-05-2006 | Отправлено: 08:04 25-04-2020
VadimLou



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вызвать для текущей сессии WinApi
  GetCurrentConsoleFontEx
  SetCurrentConsoleFontEx
и установить нужный фонт. Возможно уже есть приблуды для этого ...

Всего записей: 702 | Зарегистр. 22-07-2004 | Отправлено: 08:41 25-04-2020
Syn0pt1c

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Интересует тема песочницы/контейнеров/виртуализации и изоляции приложений. Давно ищу способ изоляции приложений путём организации "виртуального слоя" файловой системы так, как это делает Sandboxie, но не прибегая к third-party приложениям, ограничившись стандартными средствами Windows. Наткнулся на интересную статейку:
Less Privileged AppContainer  
https://xakep.ru/2018/03/22/windows-lpac/
Поскольку я нуб/ламер/ни разу не кодер, обращаюсь к местным красноглазым братишкам. Надо этот код из статьи скармливать какой-либо программе-компилятору, на выходе получая исполняемый файл? Потом запуская его из под CMD.EXE указывать путь к целевому приложению?
Помогите разобраться пожалуйста!

Всего записей: 1 | Зарегистр. 02-12-2020 | Отправлено: 15:11 13-12-2020
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
получение кода нажатой клавиши на АПИ без ожидания,
совсем всё забыл, GetAsyncKeyState() что ли?
исполнятся будет на дельфи и фортране, поэтому  -- чистый АПИ, т.е без всяких getch(), cin и kbhit()
 
Добавлено:
пока как-то так...

Код:
while true do begin
    writeln('working...');
 
    GetAsyncKeyState(VK_ESCAPE);
 
    if (GetAsyncKeyState(VK_ESCAPE) and $8000 <> 0) then begin
      writeln('ESC pressed, exiting...');
//      MessageBox(0, PChar('ESC pressed, exiting...'), PChar('title'), MB_OK);
      halt;
    end;
 
// continue work...
end;

 
Добавлено:
 
пока всё ок, только кбд-буфер за собой не чистится...

Всего записей: 24052 | Зарегистр. 06-12-2002 | Отправлено: 18:04 24-12-2020 | Исправлено: akaGM, 19:51 24-12-2020
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну это скорее определение нажата ли конкретная клавиша была.
Если нужен код нажатой клавиши, то WM_KEYDOWN для win или ReadConsoleInput() в отдельном потоке для консоли.

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 19:55 24-12-2020
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens
 
клавиша будет одна заданно-определённая, типа ctrl-F12
нужно просто прервать длительный счёт и сбросить насчитанное...
чтобы не по ктрл-С :)
 
с потоком консоли уж слишком заморочено, типа

Код:
function KeyPressed(keycode: WORD): BOOL;
var
  numEvents, i, n: DWORD;
  event: TInputRecord;
begin
  if ( GetNumberOfConsoleInputEvents(hKeyboard, numEvents) ) then begin
//    for i := 0 to numEvents-1 do begin
    for i := 1 to numEvents do begin
      if ( ReadConsoleInput(hKeyboard, event, 1, n) ) then begin
        if ( (event.EventType = KEY_EVENT) and (event.Event.KeyEvent.wVirtualKeyCode = keycode) ) then begin
          Result := TRUE;
          exit;
        end;
      end;
    end;
  end;
 
  Result := FALSE;
end;

Всего записей: 24052 | Зарегистр. 06-12-2002 | Отправлено: 19:59 24-12-2020 | Исправлено: akaGM, 20:02 24-12-2020
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ctrl-Break неподходит? Они почти рядом :)

Код:
#include <windows.h>
#include <stdio.h>
 
int g_stop;
 
BOOL WINAPI CtrlBreakHandler(DWORD dwCtrlType)
{
    if(CTRL_BREAK_EVENT == dwCtrlType)
        g_stop = 1;
 
    return TRUE;
}
 
int main()
{
    SetConsoleCtrlHandler(CtrlBreakHandler, TRUE);
    
    for( ; !g_stop; )
        printf("q");
 
    printf("\nexiting on ctrl-break\n");
}

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 20:25 24-12-2020 | Исправлено: ne_viens, 20:26 24-12-2020
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens
 
не, ктрл-брейк не подойдёт, зачем юзверей смущать, только что объяснял им что ктрл-брейк -- это брейк, а теперь -- это функциональная клавиша?
ладно, буду по сложному, зато гибко и с любой комбинацией клавиш...
 
спасибо...

Всего записей: 24052 | Зарегистр. 06-12-2002 | Отправлено: 23:55 24-12-2020
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru