Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

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

Пишу программу для вывода информации об имени пользователя и информации о компьютере. При компиляции возникает исключение: Необработанное исключение по адресу 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, 19:04   #2
AbakBarama
Пользователь
 
Регистрация: 12.05.2011
Сообщений: 38
Репутация: 47

skype: DontUseSkype
По умолчанию

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

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

Последний раз редактировалось efghi; 08.12.2018 в 20:15.
efghi вне форума   Ответить с цитированием
Старый Вчера, 04:22   #4
AbakBarama
Пользователь
 
Регистрация: 12.05.2011
Сообщений: 38
Репутация: 47

skype: DontUseSkype
По умолчанию

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

Последний раз редактировалось AbakBarama; Вчера в 09:28.
AbakBarama вне форума   Ответить с цитированием
Старый Вчера, 13:51   #5
R71MT
Профессионал
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,230
Репутация: 1048
По умолчанию

Цитата:
Сообщение от 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 вне форума   Ответить с цитированием
Старый Вчера, 17:51   #6
Mikl___
Профессионал
 
Регистрация: 11.01.2010
Сообщений: 1,129
Репутация: 943
По умолчанию

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___ вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необработанное исключение Hammerbreast C# (си шарп) 2 23.12.2015 23:41
Необработанное исключение Hellyeah C# (си шарп) 9 22.01.2015 13: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


15:54.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru