Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
 Аватар для WinstonCherchil
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
C/C++

Вызов NtUserPostMessage в ассемблерной вставке

19.11.2014, 11:37. Показов 6365. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро.

Достался "по наследству" код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
__declspec(dllexport) int __stdcall NtUserPostMes(HWND hWnd, unsigned int Msg, WPARAM wParam, LPARAM lParam)
{
    
    __asm pop ebp
    __asm mov eax, 0x11fe
    __asm call SystemCall
        __asm retn 0x10
        __asm SystemCall:
    __asm mov edx, esp
    __asm _emit 0x0f
    __asm _emit 0x34
    
}
Этот код изначально был на Дельфи, который благодаря гуглу, я смог перевести в С++ и скомпилить в Студии, однако, его очень сложно добавить в мой проект QT+Mingw. Гугл говорит надо переписать в AT&T Синтаксис эту вставку, но у меня не получилось.

Вобщем прошу помочь переписать его либо в AT&T, что бы MinGW скомпилил, либо (идеальный вариант) переписать в С++

Зарание спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.11.2014, 11:37
Ответы с готовыми решениями:

Замена элементов в строке в ассемблерной вставке
void split_and_print(char s1) { _asm { xor ebx,ebx cld mov ecx,15 mov al, '+' lea edi,s1 m_beg:

Вызов ассемблерной процедуры из программы на C++
Добрый день! Требуется написать подпрограмму на ассемблере, в которую бы передавался аргумент из программы на C++, с ним производились бы...

Прерывания в ассемблерной вставке
Здравствуйте. В программу, написанную на С++, нужно добавить ассемблерную вставку, поддерживающую прерывания (int 21h например). Каким...

25
 Аватар для WinstonCherchil
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
30.11.2014, 09:39  [ТС]
Студворк — интернет-сервис помощи студентам
Собирается, но не работает.


C++
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
62
63
// ConsoleApplication2.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
using namespace std;
 
#define SYSCALL(id,retN)    __asm { \
    __asm mov     eax, id       \
    __asm xor     ecx, ecx      \
    __asm lea     edx, [esp + 4]  \
    __asm cmp     fs : [0xC0], 0   \
    __asm jnz     $ + 11          \
    __asm int     0x2E          \
    __asm retn    retN          \
    __asm call    fs : [0xC0]     \
    __asm retn    retN          \
        }
 
 
bool  NtUserPostMes(HWND hWnd, unsigned int Msg, WPARAM wParam, LPARAM lParam);
 
int main(/*int argc, _TCHAR* argv[]*/)
{
    //calc.exe  3372    4360    787496  CalcFrame   Calculator  
 
    char c;
    long error = 0;
    SetLastError(0);
    HWND hWnd = FindWindowA("CalcFrame", NULL); 
    error = GetLastError();
    if (error || hWnd == NULL){
        cout << "Couldn't find window! error is " << error << "\n";
        cin >> c; return 1;
    }
    unsigned long int processId = 0;
    GetWindowThreadProcessId(hWnd, &processId); 
    error = GetLastError();
    if (error){
        cout << "GetWindowThreadProcessId error: " << error << "!\n";
        cin >> c; return 1;
    }
    
    //PostMessage(hWnd, WM_KEYDOWN, 0x41, 0);
    //PostMessage(hWnd, WM_KEYUP, 0x41, 0);
 
 
    //NtUserPostMes(h, WM_LBUTTONDOWN, MK_LBUTTON, 0);
    //NtUserPostMes(h, WM_LBUTTONUP, MK_LBUTTON, 0);
    
    cout << "Ready...\n";
    
    NtUserPostMes(hWnd, WM_KEYDOWN, 0x41, 0);
    NtUserPostMes(hWnd, WM_KEYUP, 0x41, 0);
    cin >> c; return 0; 
}
 
__declspec(naked) bool  NtUserPostMes(HWND hWnd, unsigned int Msg, WPARAM wParam, LPARAM lParam)
{   
    //11fe: 99d979e6 NtUserPostMessage [4] (win32k.sys)
    
    //SYSCALL(0x1011, 0x10)
    SYSCALL(0x11fc, 0x10)
}
Цитата Сообщение от Microsoft Visual Studio 2013
First-chance exception at 0x771CD7D8 in NtTests.exe: 0xC0000002: The requested operation is not implemented.
First-chance exception at 0x00000000 in NtTests.exe: 0xC0000005: Access violation executing location 0x00000000.
Unhandled exception at 0x735FC9F1 in NtTests.exe: 0xC0000005: Access violation executing location 0x00000000.
Добавлено через 3 минуты
FindWindowA находит 100%, ибо обычный PostMessage работает.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
30.11.2014, 12:10
Вы не указали соглашение о вызовах. Если в настройках проекта __cdecl то сделайте так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#define SYSCALL(id)              \
                                     \
__asm mov    eax, id             \
__asm xor     ecx, ecx           \
__asm lea     edx, [esp + 4]   \
__asm call    fs : [0xC0]        \
__asm ret                      
    
 
__declspec(naked) void NtUserPostMes(HWND hWnd, unsigned int Msg, WPARAM wParam, LPARAM lParam)
{
    SYSCALL(0x1011)
}
Если и так не заработает значит ошибка в id. Или windows не x64.
1
 Аватар для WinstonCherchil
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
30.11.2014, 20:03  [ТС]
Цитата Сообщение от maxillion Посмотреть сообщение
Если и так не заработает значит ошибка в id. Или windows не x64.
Я слышал, что для АМД и Интела часто пишут разный код на асме. Может в этом дело? У меня АМД.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
30.11.2014, 20:13
Цитата Сообщение от WinstonCherchil Посмотреть сообщение
Я слышал, что для АМД и Интела часто пишут разный код на асме
Да разница есть (MSR регистры, AMD Virtualization и Intel VMX) но она не затрагивает syscall и sysenter. У меня к стати тоже AMD и все прекрасно работает, правда на Windows 8.1. Windows 7 к сожалению не установлена , так бы и на ней проверил.
1
 Аватар для WinstonCherchil
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
30.11.2014, 20:16  [ТС]
Так, а первый вариант для какой конвенции был? Тот что Вы на Вин 8 проверяли?
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
30.11.2014, 20:20
Цитата Сообщение от WinstonCherchil Посмотреть сообщение
Так, а первый вариант для какой конвенции был? Тот что Вы на Вин 8 проверяли?
__stdcall
C++
1
__declspec(naked) void  __stdcall NtUserPostMes(HWND hWnd, unsigned int Msg, WPARAM wParam, LPARAM lParam)
Обычно если явно не прописывать то __cdecl.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2014, 20:20

Вывод массива в ассемблерной вставке
Добрый вечер. Каким образом можно массив из 10 чисел с которыми я поработал в ассемблере передать обратно в С++. Как передать одну...

Вычислить значение выражения в ассемблерной вставке в C++
посчитать a*b/c ассемблерная вставка к с++ на VS 2013. Переменные типа unsigned short, действия, как я понимаю с регистрами AX,BX... но...

Как использовать условные операторы в ассемблерной вставке
Вообщем суть в том,чтобы переписать программу,ранее написанную на паскале,в код asm Asm используется,встроенный в Turbo Pascal....

Как обращаться к членам структуры в ассемблерной вставке на си?
функция делает распаковку битовых групп. По заданию поля битовой группы передаются в структуре. Как к ним можно обращаться в ассемблерной...

В ассемблерной вставке занести слово в регистр esi
Подскажите, пожалуйста, как правильно в ассемблерной вставке занести слово в регистр esi? Задача:в слове из 8 символов найти разность...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru