как переделать этот код, чтобы он заработал? Код (ASM): .386p option casemap:none .model flat, stdcall include C:\masm32\include\ntstatus.inc include C:\masm32\include\ntddk.inc .code DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING mov eax, STATUS_DEVICE_CONFIGURATION_ERROR main: push ebx push edx xor eax, eax xor bx, bx xor dx, dx xor cx, cx ;---пpoвepкa cтaтуca клaвиши вcтaвки MOV AH,2 ;нoмep функции INT 16H ;пoлучaeм бaйт cтaтуca TEST AL,00100000B ;пpoвepяeм бит 6 (numlock выкл) JZ kon xor ax, ax mov ah,1 int 16h cmp ah,48h jnz noup mov y,9 noup: cmp ah,50h jnz nodw sub y,9 nodw: cmp ah,4bh jnz nolf sub x,9 nolf: cmp ah,4dh jnz kon mov x,9 mov ax, 3 int 33h add cx,x add dx,y mov ax,4 int 33h kon: mov x,0 mov y,0 pop edx pop ebx jmp main DriverEntry endp .data x dw ? y dw ? buttons dw ? end DriverEntry
А кто тебе разрешал юзать 16 битный код под ядром? Прерывания эти доступны только в 16-битном реалмоде. В Windows юзай другие функции.
Можно вызвать эмулятор(последует переключение в V86 режим на время) посредством Ke386CallBios(), по сути содится к сервису NtVdmControl.
спасибо, но на время мне не подходит( а сделать драйвер-фильтр для меня видимо еще сложновато. тут почитал одну статью и мало что понял(
Llirik Если неохота ковыряцца в манах (а это было бы правильно и достаточно быстро), но есть навыки реверсенга - возьми готовый sys, наверное типа русификатора - который выполняет подмену клавишь... Правда у тебя тама мышь еще - наверное это нужно найти сервис среди драйверков и позвать его. Если ты сам напейсал весь код выше у тебя есть шансы (в обоих вариантах).
подскажите, пожалуйста, почему не хочет компилироваться такой код: Код (ASM): .386p option casemap:none .model flat, stdcall include c:\masm32\include\ntoskrnl.inc includelib C:\masm32\lib\\ntoskrnl.lib include c:\masm32\Macros\Strings.mac include C:\masm32\include\ntstatus.inc include C:\masm32\include\ntddk.inc .data CCOUNTED_UNICODE_STRING "\\Device\\KeyboardClass0", g_usTargetDeviceName, 4 x dw ? y dw ? buttons dw ? .code DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local pTargetDeviceObject:PDEVICE_OBJECT local pTargetFileObject:PFILE_OBJECT invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \ addr pTargetFileObject, addr pTargetDeviceObject .if eax == STATUS_SUCCESS invoke AddDevice, addr pDriverObject, addr pTargetDeviceObject .endif mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry endp end DriverEntry ml выдаёт: Microsoft (R) Macro Assembler Version 7.00.9210 Copyright (C) Microsoft Corporation. All rights reserved. Assembling: Keymouse.asm Keymouse.asm(30) : error A2006: undefined symbol : AddDevice
пожалуйста, подскажите, что почитать, только не очень мудрёное) а ещё лучше покажите простого перехвата прерывания от какой-нибудь клавиши
Llirik Примеры из DDK, просмотр стотей Four-F, не компелиццо скорее всего потомушта не указан заголовочный файл (*.h) откудова эта функция.
Llirik При чем тут язык C? У вас другие АПИ - например IoGetDeviceObjectPointer - где описаны? А AddDevice? Вам нужен примерчег - так ищите его в наиболее доступных местах (DDK, Four-F), а уж на чем и как там написано - дело десятое.
Да какая разница на чем они написаны? Хоть на VB, это просто текстовые файлики в которых в-каком-то-там-виде есть нужная инфа. Если вам ближе ассемблер вы можете скомпеллировать исходняг из DDK и смотреть это в ассемблере. Поищите среди *.h файлов в DDK этот AddDevice - где он описан? Вам нужен заголовочный файл *.inc с таким же опейсанием. Смотрите какие Four-F заголовочные файлы юзает (FASM). Найдите поиском строки "AddDevice" любой *.sys файл в system32 и откройте его в IDA, далее посмотрите импорт - откуда эта АПИ вызываеццо и как? На уровне драйверов вроде бы тоже есть GetProcAddress, так что можно импортнуть динамически. Пользуйтесь статьями Four-F для поиска не для чтения.
и всё же подскажите, пожалуйста, где находится функция Adddevice? По идее она должна быть в ntddk.inc, но ml почему-то там её не находит
Нет шансов. Никаких. Человек не умеет сам: а) думать, б) искать, в) компелировать. Учиться всему этому он тоже не хочет, он просит готовый код. Причем драйвера! Llirik Дружище, напиши хелло ворлд, и не вспоминай про драйвера в ближайшие пару лет, пока у тебя не появится желание почитать талмуды потолще. PSR1257 Забейте или пишите по русски.
Вот скажите, что в моих кодах не так? да и первый тоже я написал. я смотрел sys`ы в директории drivers, но adddevice нигде не встретил
код: Код (Text): .386p option casemap:none .model flat, stdcall includelib C:\masm32\lib\ntoskrnl.lib include C:\masm32\include\ntstatus.inc include C:\masm32\include\ntddk.inc include C:\masm32\include\ntoskrnl.inc include c:\masm32\Macros\Strings.mac .data CCOUNTED_UNICODE_STRING "\\Device\\KeyMouse", g_usDeviceName, 4 CCOUNTED_UNICODE_STRING "\\??\\KeyMouse", g_usSymbolicLinkName, 4 CCOUNTED_UNICODE_STRING "\\Device\\KeyboardClass0", g_usTargetDeviceName, 4 FALSE equ 0 TRUE equ 1 x dw ? y dw ? buttons dw ? .code DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP mov eax, pIrp assume eax:ptr _IRP mov [eax].IoStatus.Status, STATUS_SUCCESS and [eax].IoStatus.Information, 0 assume eax:nothing fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT mov eax, STATUS_SUCCESS ret DispatchCreateClose endp QueryPnpDeviceState proc uses esi edi ebx pDeviceObject:PDEVICE_OBJECT local status:NTSTATUS local keEvent:KEVENT local iosb:IO_STATUS_BLOCK mov status, STATUS_NOT_SUPPORTED mov esi, pDeviceObject assume esi:ptr DEVICE_OBJECT .if ( esi != NULL && [esi]._Type == IO_TYPE_DEVICE ) movzx eax, [esi].StackSize invoke IoAllocateIrp, eax, FALSE assume esi:nothing .if eax != NULL mov edi, eax assume edi:ptr _IRP mov [edi].IoStatus.Status, STATUS_NOT_SUPPORTED and [edi].IoStatus.Information, 0 mov iosb.Status, STATUS_NOT_SUPPORTED and iosb.Information, 0 lea eax, iosb mov [edi].UserIosb, eax assume edi:nothing IoGetNextIrpStackLocation edi mov ebx, eax assume ebx:ptr IO_STACK_LOCATION mov [ebx].MajorFunction, IRP_MJ_PNP mov [ebx].MinorFunction, IRP_MN_QUERY_PNP_DEVICE_STATE assume ebx:nothing invoke KeInitializeEvent, addr keEvent, NotificationEvent, FALSE IoSetCompletionRoutine edi, IrpComplete, addr keEvent, TRUE, TRUE, TRUE invoke IoCallDriver, esi, edi mov status, eax .if eax == STATUS_PENDING invoke DbgPrint, $CTA0("QueryPnpDeviceState: Request pended. Waiting...\n") invoke KeWaitForSingleObject, addr keEvent, Executive, KernelMode, FALSE, NULL mov eax, iosb.Status mov status, eax .endif .if status == STATUS_SUCCESS invoke DbgPrint, $CTA0("QueryPnpDeviceState: Device State: %08X\n"), iosb.Information .endif .else mov status, STATUS_INSUFFICIENT_RESOURCES .endif .endif mov eax, status ret QueryPnpDeviceState endp .code INIT DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local status:NTSTATUS local pDeviceObject:PVOID local pTargetDeviceObject:PDEVICE_OBJECT local pTargetFileObject:PFILE_OBJECT mov status, STATUS_DEVICE_CONFIGURATION_ERROR invoke IoCreateDevice, pDriverObject, 0, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \ 0, FALSE, addr pDeviceObject .if eax == STATUS_SUCCESS invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName .if eax == STATUS_SUCCESS invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \ addr pTargetFileObject, addr pTargetDeviceObject invoke IoAttachDeviceToDeviceStack, pDeviceObject, pTargetDeviceObject invoke QueryPnpDeviceState, pTargetDeviceObject ; mov eax, pDriverObject ; assume eax:PTR DRIVER_OBJECT ; mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)], offset DispatchCreateClose ; mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)], offset DispatchCreateClose ; mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset DispatchControl ; mov [eax].DriverUnload, offset DriverUnload ; assume eax:nothing mov status, STATUS_SUCCESS .else invoke IoDeleteDevice, pDeviceObject .endif .endif mov eax, status ret DriverEntry endp end DriverEntry ошибка: Код (Text): Microsoft (R) Macro Assembler Version 7.00.9210 Copyright (C) Microsoft Corporation. All rights reserved. Assembling: Keymouse.asm Keymouse.asm(82) : ERROR! Pointer to CompletionRoutine improperly specified. Keymouse.asm(83) : error A2052: forced error IoSetCompletionRoutine(13): Macro Called From Keymouse.asm(83): Main Line Code пожалуйста подскажите как её устранить ________________________________________ Не забываем пользоваться тегом [code][/code] — G13