Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2018, 16:41   #1
efghi
 
Регистрация: 06.12.2018
Сообщений: 4
По умолчанию Необработанное исключение в ассемблере.

Пишу программу для вывода информации об имени пользователя и информации о компьютере. При компиляции возникает исключение: Необработанное исключение по адресу 0x00007FFE034CA24A (sspicli.dll) в z1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000000000000101. Из за чего это может происходить?
Код:
extrn GetUserNameA :proc, 
GetComputerNameA :proc, 
GetTempPathA :proc, 
GetVersionExA :proc, 
wsprintfA :proc, 
MessageBoxA :proc, 
ExitProcess :proc 
 
.data 
cap db '<заголовок окна>', 0 
fmt db 'Username: %s',0Ah, 
'Computer name: %s', 0Ah, 
'TMP Path: %s', 0Ah, 
'OS version: %d.%d.%d', 0 
 
OSVERSIONINFO struct 
dwOSVersionInfoSize dword ? 
dwMajorVersion dword ? 
dwMinorVersion dword ? 
dwBuildNumber dword ? 
dwPlatformId dword ? 
szCSDVersion byte 128 dup(?) 
OSVERSIONINFO ends 
.code 
Start proc 
;Объявление локальных переменных 
szMAX_COMP_NAME = 16 
szUNLEN = 257 
szMAX_PATH = 261 
 
local _msg[1024] :byte, 
_username[szUNLEN] :byte, 
_compname[szMAX_COMP_NAME] :byte, 
_temppath[szMAX_PATH] :byte, 
_v :OSVERSIONINFO, 
_size :dword 
 
 
;Подготовка стека 
sub RSP, 8*5 
and SPL, 0F0h 
 
;Получение имени пользователя, названия компьютера и пути до директории временных файлов 
mov _size, szUNLEN         ; в _size размер строки имени пользователя 
lea RCX, _username            ; адрес в rcx
mov RDX, szUNLEN              ;размер в RDX
call GetUserNameA 
 
mov _size, szMAX_COMP_NAME; 
lea RCX, _compname 
mov RDX, szMAX_COMP_NAME 
call GetComputerNameA 
 
mov _size, szMAX_PATH;  
mov RCX, szMAX_PATH
lea RDX, _temppath 
call GetTempPathA 
 
;Получение сведений о системе 
mov al,0 
;xor al,al 
mov rcx, size _v ;занесем в регистр RCX размер экземпляра _v
lea rdi, _v ; адрес _v
rep stos byte ptr [RDI] 
mov _v.dwOSVersionInfoSize, ecx ; размер структуры поместим в _v.dwOSVersionInfoSize ; размер структуры поместим в _v.dwOSVersionInfoSize
call GetVersionExA 
 
;Формирование отформатированной строки 
lea rcx, _msg 
lea rdx, fmt 
lea r8, _username 
lea r9, _compname 
call wsprintfA 
 
;Отображение полученной информации в диалоговом окне 
mov rcx,0 
mov r9,0 
lea rdx, _msg 
lea r8, cap 
call MessageBoxA 
 
mov rcx,0 
call ExitProcess 
ret
Start endp 
end
efghi вне форума Ответить с цитированием
Старый 08.12.2018, 18:04   #2
AbakBarama
Пользователь
 
Регистрация: 12.05.2011
Сообщений: 57
По умолчанию

На 2-ой параметр GetUserNameA() обратите внимание.
AbakBarama вне форума Ответить с цитированием
Старый 08.12.2018, 19:09   #3
efghi
 
Регистрация: 06.12.2018
Сообщений: 4
По умолчанию

Цитата:
Сообщение от AbakBarama Посмотреть сообщение
На 2-ой параметр GetUserNameA() обратите внимание.
А что не так со вторым аргументом? второй аргумент это буфер 257 байт минимум, и он у меня в rdx находится или нужно напрямую размер указывать?

Последний раз редактировалось efghi; 08.12.2018 в 19:15.
efghi вне форума Ответить с цитированием
Старый 09.12.2018, 03:22   #4
AbakBarama
Пользователь
 
Регистрация: 12.05.2011
Сообщений: 57
По умолчанию

Вы-то как раз размер и указали. Сообщение об ошибке по адресу 0x0000000000000101 сразу же ассоциируется с числом szUNLEN=257, можно даже описание GetUserNameA() не читать.

Последний раз редактировалось AbakBarama; 09.12.2018 в 08:28.
AbakBarama вне форума Ответить с цитированием
Старый 09.12.2018, 12:51   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от efghi Посмотреть сообщение
Пишу программу для вывода информации об имени пользователя и информации о компьютере.
когда система создаёт процесс,
она весь 'Environment' машины загружает в пространство юзера.
не знаю как на х64, но на х32 этот буфер находится в самом подвале, по адресу 00010000h. Только эти строки хранятся там в формате Unicode (после каждого символа вставляется нуль), так-что нужно перевести в ASCII (читать по 2-байта, а сохранять по одному). Код получается намного компактней, но и инфы выводит намнооого больше. Вот пример реализации на fasm'e:
Код:
format   pe gui
include 'win32ax.inc'
.data
buff    db      2048 dup(0)

.code
start:  mov     esi,10000h      ; указатель на источник
        mov     edi,buff        ; приёмник
; Unicode в ASCII --------
@find:  lodsw                   ; берём сразу по 2-байта
        or      ax,ax           ; конец строки?
        jz      @test           ; да!
        stosb                   ; иначе: Unicode-->ASCII
        jmp     @find           ;
; Проверка на конец блока данных --------
@test:  cmp     dword[esi],0    ;
        je      @stop           ; если болото нулей
        mov     ax,0a0dh        ; иначе: CR_LF
        stosw                   ;
        jmp     @find           ; следующая строка

@stop:  invoke  MessageBox,0,buff,0,0    ; боксим мессагу
        invoke  ExitProcess,0
.end start
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 09.12.2018, 16:51   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

efghi
Код:
; GUI #
include win64a.inc
include advapi32.inc
includelib advapi32.lib

OSVERSIONINFO struct 
	dwOSVersionInfoSize	dd ?;94h 
	dwMajorVersion		dd ?;6 
	dwMinorVersion		dd ?;1 
	dwBuildNumber		dd ?;1DB1 
	dwPlatformId		dd ?;2 
	szCSDVersion		db 128 dup(?) 
OSVERSIONINFO ends 
szMAX_COMP_NAME = 16 
szUNLEN = 257 
szMAX_PATH = 261
.code
cap db 'заголовок окна', 0 
fmt db 'Username: %s',10,'Computer name: %s',10,'TMP Path: %s',10
db 'OS version: %d %d %d %s',0 
WinMain proc 
local _msg[1024]:byte
local _username[szUNLEN]:byte
local _compname[szMAX_COMP_NAME]:byte
local _temppath[szMAX_PATH]:byte
local _v :OSVERSIONINFO
local _size :dword
 
	;Получение имени пользователя, названия компьютера и пути до директории временных файлов 
	lea edx,_size
	mov dword ptr [rdx],szUNLEN         ; в _size размер строки имени пользователя 
	lea ecx,_username            ; адрес в rcx
	invoke GetUserName
 
	lea edx,_size
	mov dword ptr [rdx],szMAX_COMP_NAME
	lea ecx,_compname 
	invoke GetComputerName
 
	lea edx,_temppath
	invoke GetTempPath,szMAX_PATH 
 
;Получение сведений о системе 
	lea ecx,_v
	mov dword ptr [rcx],sizeof OSVERSIONINFO;_v.dwOSVersionInfoSize,(sizeof OSVERSIONINFO); размер структуры поместим в _v.dwOSVersionInfoSize ; размер структуры поместим в _v.dwOSVersionInfoSize
	invoke GetVersionEx ;занесем в регистр RCX размер экземпляра _v 
 
;Формирование строки 

	lea eax,_v.szCSDVersion
	mov [rsp+40h],rax
	mov eax,_v.dwPlatformId
	mov [rsp+38h],rax
	mov eax,_v.dwBuildNumber
	mov [rsp+30h],rax
	mov eax,_v.dwMinorVersion
	mov [rsp+28h],rax
	lea eax,_temppath
	mov [rsp+20h],rax
	lea r9d,_compname
	lea r8d,_username 
	mov edx,offset fmt 
	lea ecx,_msg  
	invoke wsprintf
 
;Отображение полученной информации в диалоговом окне 
	lea edx,_msg 
	mov r8d,offset cap 
	invoke MessageBox,0,,,MB_OK
	invoke RtlExitUserProcess,NULL
WinMain endp
end
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необработанное исключение Hammerbreast C# (си шарп) 2 23.12.2015 22:41
Необработанное исключение Hellyeah C# (си шарп) 9 22.01.2015 12:34
Необработанное исключение nik-maximal Visual C++ 0 23.04.2014 16:45
Необработанное исключение. fredwriter Visual C++ 2 19.04.2014 05:52
Необработанное исключение Faton 11 Общие вопросы C/C++ 4 31.10.2012 00:29