SetCurrentDirectory, Ошибка

Тема в разделе "WASM.WIN32", создана пользователем undsoft, 17 июн 2008.

  1. undsoft

    undsoft New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2008
    Сообщения:
    3
    Недавно начал писать программу на masm'e c использованием WinApi функций. Появилась странная ошибка. Я не понимаю, почему. Оно сводит меня с ума.
    При создании окна вызывается функция, которая должна установить куррент дайректори в Modules (папка создана). При этом возникает ошибка 998:
    При чем, если вынести вызов функции SetCurrentDirectory не в отдельную функцию, а в WndProc, то все работает.

    Please, help!

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. .stack 100h
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. includelib \masm32\lib\user32.lib        
    8. include \masm32\include\kernel32.inc
    9. includelib \masm32\lib\kernel32.lib
    10.  
    11. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    12.  
    13. .CONST
    14.     IDButSort db 1
    15.     IDButBench db 2
    16.     IDEditInfo db 3
    17.     IDEditNumber db 4
    18.     IDList db 5
    19.    
    20. .DATA
    21.     ClassName db "MyClass",0        
    22.     AppName db "MegaSorter 0.1 build 1000",0    
    23.     ButtonClassName db "BUTTON", 0 
    24.     EditClassName db "EDIT", 0
    25.     ListClassName db "LISTBOX", 0
    26.     ButtonText db "Sort",0
    27.     FolderToSearchIn db "Modules", 0
    28.     ButtonText2 db "Benchmark", 0
    29.    
    30.     ErrorMessage db "Error happened", 0
    31.     FileMask db "*.dll",0
    32.     ErrMesDirectory db "Can't change directory. Please check whether Modules folder exists",0
    33.     blad db 256 dup(0)
    34.    
    35. .DATA?              
    36.     hInstance HINSTANCE ?
    37.     CommandLine LPSTR ?
    38.     hButtonSort HWND ?
    39.     hButtonBench HWND ?
    40.     hEditInfo HWND ?
    41.     hEditNumber HWND ?
    42.     hList HWND ?
    43.     bla dd ?
    44.     hHeap HANDLE ?
    45.     HeapAddrStart LPVOID ?
    46.     HeadNameStart LPVOID ?
    47. .CODE      
    48. start:
    49. invoke GetModuleHandle, NULL  
    50. mov hInstance,eax
    51.  
    52. invoke GetCommandLine                      
    53. mov CommandLine,eax
    54. invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    55. invoke ExitProcess, eax
    56.  
    57. MakeDLLList proc ;Look for dlls and fill the list
    58.     LOCAL hSearch: WIN32_FIND_DATA
    59.     LOCAL nFileCount: DWORD
    60.     LOCAL hFind: HANDLE
    61.     invoke GetCurrentDirectory, 255, addr blad
    62.         invoke MessageBox, NULL, addr blad, addr blad, MB_OK or MB_ICONERROR
    63.     invoke SetCurrentDirectory, addr FolderToSearchIn
    64.     .if eax==0
    65.             invoke GetCurrentDirectory, 255,addr blad
    66.         invoke MessageBox, NULL, addr blad, addr blad, MB_OK or MB_ICONERROR
    67.         invoke MessageBox, NULL, addr ErrMesDirectory, addr ErrorMessage, MB_OK or MB_ICONERROR
    68.         ret
    69.     .else
    70.         invoke FindFirstFile, addr FileMask, addr hSearch
    71.         .if eax==INVALID_HANDLE_VALUE
    72.             ret
    73.         .else
    74.             mov hFind, eax
    75.             invoke GetProcessHeap
    76.             mov hHeap,eax
    77.            
    78.             .repeat
    79.                 inc nFileCount
    80.                 invoke FindNextFile, hFind, addr hSearch
    81.             .until eax!=0
    82.            
    83.             mov eax, nFileCount
    84.             mov bx, 0
    85.             idiv bx
    86.            
    87.     ;       invoke HeapAlloc, hHeap, HEAP_ZERO_MEMORY
    88.         ;   mov HeapAddrStart, eax
    89.            
    90.         ;   invoke HeapAlloc, hHeap, HEAP_ZERO_MEMORY   ; Freed some place for array with dll names
    91.         ;   mov HeapAddrStart, eax
    92.            
    93.         .endif
    94.     .endif
    95. MakeDLLList endp
    96.    
    97. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    98.     LOCAL wc:WNDCLASSEX
    99.     LOCAL msg:MSG
    100.     LOCAL hwnd:HWND
    101.  
    102.     mov   wc.cbSize,SIZEOF WNDCLASSEX
    103.     mov   wc.style, CS_HREDRAW or CS_VREDRAW
    104.     mov   wc.lpfnWndProc, OFFSET WndProc
    105.     mov   wc.cbClsExtra,NULL
    106.     mov   wc.cbWndExtra,NULL
    107.     push  hInstance
    108.     pop   wc.hInstance
    109.     mov   wc.hbrBackground,COLOR_WINDOW-3
    110.     mov   wc.lpszMenuName,NULL
    111.     mov   wc.lpszClassName,OFFSET ClassName
    112.     invoke LoadIcon,NULL,IDI_APPLICATION
    113.     mov   wc.hIcon,eax
    114.     mov   wc.hIconSm,eax
    115.     invoke LoadCursor,NULL,IDC_ARROW
    116.     mov   wc.hCursor,eax
    117.    
    118.     invoke RegisterClassEx, addr wc
    119.     invoke CreateWindowEx,NULL, ADDR ClassName, ADDR AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 625, 675, NULL, NULL, hInst, NULL
    120.     mov   hwnd,eax
    121.    
    122.     invoke ShowWindow, hwnd,CmdShow
    123.     invoke UpdateWindow, hwnd      
    124.  
    125.     .WHILE TRUE    
    126.                 invoke GetMessage, ADDR msg,NULL,0,0
    127.                 .BREAK .IF (!eax)
    128.                 invoke TranslateMessage, ADDR msg
    129.                 invoke DispatchMessage, ADDR msg
    130.    .ENDW
    131.     mov     eax,msg.wParam  
    132.     ret
    133. WinMain endp
    134.  
    135. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    136.     .IF uMsg==WM_DESTROY    
    137.         invoke PostQuitMessage,NULL    
    138.        
    139.     .elseif uMsg == WM_CREATE ;Creation of control elements
    140.         ;Sort button
    141.         invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonText, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 400, 120, 80, 30, hWnd, IDButSort, hInstance, NULL
    142.         mov hButtonSort, eax
    143.        
    144.         ;Benchmark button
    145.         invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonText2, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 400, 170, 80, 30, hWnd, IDButBench, hInstance, NULL
    146.         mov hButtonBench, eax
    147.        
    148.         ;Edit box with information
    149.         invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 285, 350, 318, 284, hWnd, IDEditInfo, hInstance, NULL
    150.         mov hEditInfo, eax
    151.        
    152.         ;Edit box to input array size
    153.         invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 400, 50, 80, 20, hWnd, IDEditNumber, hInstance, NULL
    154.         mov hEditNumber, eax
    155.        
    156.         ; List of DLL modules
    157.         invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr ListClassName, NULL, WS_CHILD or WS_VISIBLE or LBS_SORT, 10, 10, 270, 628, hWnd, IDList, hInstance, NULL
    158.         mov hList, eax
    159.        
    160.         ; Looking for DLL modules and storing their handles
    161.         call MakeDLLList
    162.     .ELSE
    163.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam    
    164.         ret
    165.     .ENDIF
    166.     xor eax,eax
    167.     ret
    168. WndProc endp
    169.  
    170. end start
     
  2. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Код (Text):
    1.     IDButSort db 1
    2. ...
    3.         invoke CreateWindowEx, ..., IDButSort, ...
    masm превращает в
    Код (Text):
    1.     mov al, [IDButSort]
    2.     movzx   ax, al
    3.     push    ax
    Таким образом, в стек запихивается 2 байта вместо 4-х. В результате стек становится несбалансированным (ибо CreateWindowEx честно вытолкнет 4 байта) и невыровненным на границу 4 байта. Последнее обстоятельство очень не нравится многим API-функциям.

    Возможные решения:
    1. Убрать секцию .CONST, заменив все байтовые переменные на equ.
    2. В секции .CONST сделать переменные dword'ами.
    3. Перейти на fasm, не подверженный глюкам masm'а.
    4. Писать без invoke. "push IDButSort" просто так не скомпилировалось бы.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    diamond
    masm превращает в ... в стек запихивается 2 байта вместо 4-х
    На самом деле шесть, ты не учел предыдыщее 6A 00, а надо 66 6A 00.
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    q_q
    Действительно, не учел, спасибо. Впрочем, на остальные выводы это не влияет :) Но в таком случае логика masm'а мне вообще непонятна. Без push 0 это поведение ещё можно объяснить наследием 16-битного режима...
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    diamond
    на остальные выводы это не влияет
    Неоспоримо.

    логика masm'а мне вообще непонятна
    Наверное masm хотел сначала ноль (как слово, но пропустил 66h), а потом AX.
     
  6. undsoft

    undsoft New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2008
    Сообщения:
    3
    Спасибо. Сам не догадался бы. Поменял там на equ - заработало. Но вот другой код, ошибка та же. Я уже поменял на equ все что можно было, поставил везде push вместо invoke. DD вместо DB. Не понимаю я принцип этой ошибки. Помогите.
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. .stack 1000h
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. includelib \masm32\lib\user32.lib        
    8. include \masm32\include\kernel32.inc
    9. includelib \masm32\lib\kernel32.lib
    10. include \masm32\include\dialogs.inc
    11.  
    12. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    13. dlgproc PROTO :DWORD,:DWORD,:DWORD,:DWORD
    14.  
    15.     IDButSort equ 101
    16.     IDButBench equ 102
    17.     IDEditInfo equ 103
    18.     IDEditNumber equ 104
    19.     IDButRandom equ 105
    20.     IDList equ 106
    21.     base equ 10
    22.    
    23. .DATA
    24.     testText1 db "Sorting in process...",0
    25.     filepath db "C:\temp\numbers.txt",0
    26.     ClassName db "MyClass",0        
    27.     AppName db "MegaSorter 0.1 build 1000",0
    28.     txtFileNOTFOUND db "TXT file with random numbers can't be loaded! Now automaticly will be generated new, if You want to change it press 'randoms' button",0
    29.     ButtonClassName db "BUTTON", 0 
    30.     EditClassName db "EDIT", 0
    31.     ButtonText db "Sort",0
    32.     ButtonText2 db "Benchmark", 0
    33.     ButtonText3 db "Randoms", 0
    34. NumberOfElements dd 100000
    35.     Limit   dd 1000
    36.     len dd 1
    37.     ascii dd 255 dup(0)
    38.     ListClassName db "LISTBOX", 0
    39.     minus dd 0
    40.     fbuffer dd 0
    41. .DATA?              
    42.     hInstance HINSTANCE ?
    43.     CommandLine LPSTR ?
    44.     lpfilepath LPSTR ?
    45.     lpfbuffer LPSTR ?
    46.         hFileTXT HANDLE ?
    47.         hButtonSort HWND ?
    48.         hList HWND ?
    49.         hButtonRandom HWND ?
    50.         hButtonBench HWND ?
    51.         hEditInfo HWND ?
    52.         hEditNumber HWND ?
    53.         hmemory HGLOBAL ?
    54.         lpmemoryalloc dd ?
    55.         NumberOfElemBytes dd ?
    56.         CurNumbBuff dd ?
    57.         isNumbRead dd ?
    58.         ;   bla dd 2 dup(?)
    59.             ;bla23 dd 20h
    60.             temp dd ?
    61.         ;   bla2 dw 3Dh
    62.         hButn1 dd ?
    63.         hButn2 dd ?
    64.     randomVALUE dd ?   
    65.    
    66.     temp1 dd ?
    67.     num1 dd ?
    68.    
    69.     num2 dd ?
    70.  
    71.    
    72.     .CODE      
    73. start:
    74. push 0
    75. call GetModuleHandle  
    76. mov hInstance,eax
    77.  
    78.  
    79. call GetCommandLine                      
    80. mov CommandLine,eax
    81. push SW_SHOWDEFAULT
    82. push  CommandLine
    83. push NULL
    84. push hInstance
    85. call WinMain
    86. push eax
    87. call ExitProcess
    88.  
    89. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    90. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    91. r_init:
    92. push ebp
    93. push eax
    94. push edx ; Сохраняем в стэке ebp
    95. ; eax, edx
    96.  
    97. call __delta1_ ;
    98. __delta1_: pop ebp ; Получение дельта смещения
    99. sub ebp,offset __delta1_ ;
    100.  
    101. db 0fh,031h ; Получаем случайное зерно
    102. mov rand_seed,eax ;
    103.  
    104. pop edx
    105. pop eax
    106. pop ebp ; Восстанавливаем edx
    107. ; eax, ebp
    108.  
    109. ret ; Возврат из подпрограммы
    110.  
    111. ;---[Подпрограмма генерации случаного числа в диапазоне]---;
    112.  
    113. brandom32: ; Эта подпрограмма
    114. ; возвращает случайное число
    115. ; в диапазоне 0..eax-1
    116.  
    117. push edx
    118. push ecx
    119. push ebp ; Сохраняем в стэке edx
    120. ; ecx, ebp
    121.  
    122. call __delta2_ ;
    123. __delta2_: pop ebp ; Получение дельта смещения
    124. sub ebp,offset __delta2_ ;
    125.  
    126. imul eax,eax,100 ; Умножаем eax на 100
    127. push eax ; и сохраняем eax в стэке
    128.  
    129. call random32 ; Вызываем подпрограмму
    130. ; генерации случайного числа
    131. xor edx,edx ; Обнуляем edx
    132. pop ecx ; Восстанавливаем значение
    133. ; из стэка в ecx
    134. div ecx ; Делим eax на ecx
    135. xchg eax,edx ; Помещаем остаток в eax
    136. xor edx,edx ; Обнуляем edx
    137. push 100 ; Помещаем в ecx - 100
    138. pop ecx ;
    139. div ecx ; Делим eax на ecx
    140. pop ebp
    141. pop ecx
    142. pop edx ; Восстанавливаем ebp, ecx,
    143. ; edx
    144. ret ; Возврат из подпрограммы
    145.  
    146. random32:
    147. push ebp
    148.  
    149. call __delta3_ ;
    150. __delta3_: pop ebp ; Получение дельта смещения
    151. sub ebp,offset __delta3_ ;
    152.  
    153. mov eax,12345678h ;
    154. rand_seed= dword ptr $-4 ;
    155. imul eax,00019660Dh ;
    156. add eax,03C6EF35Fh ; Математические операции
    157. mov [ebp+rand_seed],eax ; для получения случайного
    158. shr eax,16 ; числа
    159. imul eax,[esp+4] ;
    160.  
    161. pop ebp
    162.  
    163. retn ; Возврат из подпрограммы
    164.  
    165. eaxLencalc proc ;len of eax to len
    166. push eax
    167. push edx
    168. push esi
    169. xor edx,edx
    170. xor esi,esi
    171. mov len,0
    172. mov esi, base
    173. lenloop:
    174. CDQ
    175. div esi
    176. add len,1
    177. cmp eax,0
    178. jne lenloop
    179. pop esi
    180. pop edx
    181. pop eax
    182. ret
    183. eaxLencalc endp
    184. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    185. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    186.  
    187. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    188. num2string proc ;eax 2 ascii
    189. ;mov eax,4321
    190. push esi
    191. push ebx
    192. push edx
    193. mov esi, base
    194. mov ebx, offset ascii
    195. add ebx, len
    196. convloop:
    197. xor edx, edx
    198. idiv esi
    199. add edx, '0'
    200. sub ebx, 1
    201. mov byte ptr[ebx], dl
    202. or eax, eax
    203. jnz convloop
    204. pop edx
    205. pop ebx
    206. pop esi
    207. ret
    208. num2string endp
    209. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    210.  
    211.  
    212. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    213. openTXTfile proc        ;Opening file with numbers
    214.    
    215.     push 0
    216.     push FILE_ATTRIBUTE_NORMAL
    217.     push OPEN_EXISTING
    218.     push 0
    219.     push 0
    220.     push GENERIC_READ
    221.     lea edi,filepath
    222.     push edi
    223.     call CreateFile
    224.     mov hFileTXT,eax
    225.     call GetLastError
    226.     cmp eax,0;          
    227.     je  txtfileexist ; if  can't open file, ...
    228.     ;push MB_OK or MB_ICONERROR
    229.     ;push 0
    230.     ;lea edi, txtFileNOTFOUND
    231.     ;push 0
    232.     ;call MessageBox
    233.     ;call generateTXTfile ; ... will be created new one
    234.     txtfileexist:
    235.    
    236.     mov eax,NumberOfElements
    237.     imul eax,4
    238.     mov NumberOfElemBytes,eax
    239.    
    240.     ;push NumberOfElements
    241.     ;push GPTR
    242.     ;call GlobalAlloc
    243. ;   mov lpmemoryalloc,eax
    244. ;   invoke MessageBox, NULL, addr lpmemoryalloc, addr lpmemoryalloc, MB_OK or MB_ICONERROR
    245.     ;cmp eax,NULL
    246. ;   jne memoryOK
    247.     ;push MB_OK
    248.     ;push 0
    249.     ;push 0
    250.     ;push 0
    251.     ;call MessageBox
    252.     ;memoryOK:
    253. ;   mov [lpmemoryalloc],7ch
    254. ;   invoke MessageBox, NULL, addr [lpmemoryalloc], addr lpmemoryalloc, MB_OK or MB_ICONERROR
    255. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    256. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    257. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    258. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    259. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    260. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    261.     push 0
    262.     lea edi, isNumbRead
    263.     push edi
    264.     push 1
    265.     push CurNumbBuff
    266.     push hFileTXT
    267.     call ReadFile        ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    268.    
    269. call    GetLastError
    270.     mov temp1,eax
    271.     mov ebx,0
    272.     div ebx
    273. ;   sub temp1,170
    274. ;   invoke MessageBox, NULL, addr [temp1], addr temp1, MB_OK or MB_ICONERROR
    275. ;   mov CurNumbBuff,31h
    276. ;   invoke MessageBox, NULL, addr [CurNumbBuff], addr temp1, MB_OK or MB_ICONERROR
    277.  
    278. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    279. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    280. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    281. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    282. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    283. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    284.    
    285.    
    286. ;   mov dword ptr [lpmemoryalloc],31h
    287.  
    288. ;   invoke MessageBox, NULL, addr [lpmemoryalloc], addr lpmemoryalloc, MB_OK or MB_ICONERROR
    289.    
    290.     ret
    291. openTXTfile endp   
    292. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    293.    
    294.  
    295. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    296. generateTXTfile proc
    297. lea edi, filepath
    298.       mov lpfilepath,edi
    299.       push 0
    300.       push FILE_ATTRIBUTE_NORMAL
    301.       push CREATE_ALWAYS
    302.       push 0
    303.       push 0
    304.       push GENERIC_WRITE
    305.       push lpfilepath
    306.       call CreateFile
    307.       mov hFileTXT,eax
    308.       xor ecx,ecx
    309.       mov ecx,NumberOfElements;    number of elements
    310.       randomLOOP:
    311.       push ecx
    312.         ;xor eax,eax
    313.         call r_init
    314.         mov eax,Limit;  limit
    315.         call brandom32
    316. ;       mov eax,123456
    317.         call eaxLencalc
    318.         call num2string
    319.         push esi
    320.         mov esi,len
    321.         mov [ascii+esi],7ch
    322.         pop esi
    323.         inc len
    324.     push 0
    325.     lea edi, temp
    326.     push edi
    327.     push len
    328.     lea edi,ascii
    329.     push edi
    330.     push hFileTXT
    331.     call WriteFile  ; file save
    332.       pop ecx
    333.       loop randomLOOP
    334.       push hFileTXT
    335.       call CloseHandle
    336.       ret
    337. generateTXTfile endp     
    338. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    339.    
    340.    
    341. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    342. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    343.     LOCAL wc:WNDCLASSEX
    344.     LOCAL msg:MSG
    345.     LOCAL hwnd:HWND
    346.  
    347.     mov   wc.cbSize,SIZEOF WNDCLASSEX
    348.     mov   wc.style, CS_HREDRAW or CS_VREDRAW
    349.     mov   wc.lpfnWndProc, OFFSET WndProc
    350.     mov   wc.cbClsExtra,NULL
    351.     mov   wc.cbWndExtra,NULL
    352.     push  hInstance
    353.     pop   wc.hInstance
    354.     mov   wc.hbrBackground,COLOR_WINDOW-3
    355.     mov   wc.lpszMenuName,NULL
    356.     mov   wc.lpszClassName,OFFSET ClassName
    357.     push IDI_APPLICATION
    358.     push 0
    359.     call LoadIcon
    360.     mov   wc.hIcon,eax
    361.     mov   wc.hIconSm,eax
    362.     push IDC_ARROW
    363.     push 0
    364.     call LoadCursor
    365.     mov   wc.hCursor,eax
    366.    
    367.     lea edi,wc
    368.     push edi
    369.     call RegisterClassEx
    370.     push 0
    371.     push hInst
    372.     push 0
    373.     push 0
    374.     push 500
    375.     push 800
    376.     push CW_USEDEFAULT
    377.     push CW_USEDEFAULT
    378.     push WS_OVERLAPPEDWINDOW
    379.     lea edi, AppName
    380.     push edi
    381.     lea edi, ClassName
    382.     push edi
    383.     push 0
    384.     call CreateWindowEx
    385.     mov   hwnd,eax
    386.    
    387.     push CmdShow
    388.     push hwnd
    389.     call ShowWindow
    390.    
    391.     push hwnd
    392.     call UpdateWindow      
    393.  
    394.     .WHILE TRUE    
    395.                 invoke GetMessage, ADDR msg,NULL,0,0
    396.                 .BREAK .IF (!eax)
    397.                 invoke TranslateMessage, ADDR msg
    398.                 invoke DispatchMessage, ADDR msg
    399.    .ENDW
    400.     mov     eax,msg.wParam  
    401.     ret
    402.    
    403. WinMain endp
    404. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    405.  
    406. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    407. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    408.  
    409.     .IF uMsg==WM_DESTROY    
    410.         push 0
    411.         call PostQuitMessage    
    412.        
    413.     .elseif uMsg == WM_CREATE ;Creation of control elements
    414.    
    415.         call openTXTfile
    416.        
    417.         push 0
    418.         push hInstance
    419.         push IDButSort
    420.         push hWnd
    421.         push 30
    422.         push 80
    423.         push 30
    424.         push 700
    425.         push WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON
    426.         lea edi, ButtonText
    427.         push edi
    428.         lea edi,ButtonClassName
    429.         push edi
    430.         push 0
    431.         call CreateWindowEx
    432.         mov hButtonSort, eax
    433.        
    434.     ;   invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonText2, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 700, 90, 80, 30, hWnd, IDButBench, hInstance, NULL
    435.         ;mov hButtonBench, eax
    436.        
    437.         ;invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonText3, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 700, 230, 80, 30, hWnd, IDButRandom, hInstance, NULL
    438.     ;   mov hButtonRandom, eax
    439.        
    440.         ;Edit box with information
    441.     ;   invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD or WS_VISIBLE, 230, 150, 300, 280, hWnd, IDEditInfo, hInstance, NULL
    442.     ;   mov hEditInfo, eax
    443.        
    444.         ;List of DLL modules
    445.     ;   invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr ListClassName, NULL, WS_CHILD or WS_VISIBLE, 10, 70, 200, 400, hWnd, IDList, hInstance, NULL
    446.     ;   mov hList, eax
    447.    
    448.     .elseif uMsg == WM_COMMAND
    449.         .if wParam == 101
    450.         push MB_OK
    451.         push 0
    452.         push 0
    453.         push 0
    454.         call MessageBox
    455.         .endif
    456.         .if wParam == 105
    457.          
    458.           Dialog "Create randoms","ыыы",10, WS_OVERLAPPED or WS_SYSMENU or DS_CENTER, 2,50,50,150,80, 1024                                            ; memory buffer size
    459.     ;DlgStatic "number of elements",5,0,10,100,10
    460.     DlgButton "&OK",WS_TABSTOP,48,40,50,15,220
    461.    
    462.     DlgEdit 5,10,10,100,10,202
    463.  
    464.     CallModalDialog hInstance,0,dlgproc,NULL
    465.     ret
    466.         .endif
    467.     .ELSE
    468.         push lParam
    469.         push wParam
    470.         push uMsg
    471.         push hWnd
    472.         call DefWindowProc
    473.         ret
    474.     .ENDIF
    475.  
    476.     xor eax,eax
    477.     ret
    478. WndProc endp
    479. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    480.  
    481. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    482. dlgproc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    483.     .if uMsg == WM_INITDIALOG
    484.     .elseif uMsg == WM_COMMAND
    485.       .if wParam == 220  
    486.      
    487.       ;mov NumberOfElements, SOME NUMBER
    488.       ;mov Limit, SOME NUMBER
    489.       push hFileTXT
    490.      
    491.       call CloseHandle ;close previous file
    492.       call generateTXTfile         ;generate new one
    493.       jmp quit_dialog
    494.       .endif
    495.       .elseif uMsg == WM_CLOSE
    496.       quit_dialog:
    497.       push 0
    498.       push hWin
    499.       call EndDialog
    500.      .endif
    501.      xor eax, eax
    502.     ret
    503. dlgproc endp
    504. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    505.  
    506. end start
    507.  
    508.     ;   invoke Beep,200,200
    509.       ;mov NumberOfElements, SOME NUMBER
    510.       ;mov Limit, SOME NUMBER
     
  7. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    На этот раз, в отличие от предыдущего случая, ошибка никак не связана со стеком, а всё проще, действительно "Invalid access to memory location": вот здесь
    Код (Text):
    1.     push 0
    2.     lea edi, isNumbRead
    3.     push edi
    4.     push 1
    5.     push CurNumbBuff
    6.     push hFileTXT
    7.     call ReadFile
    нужно писать
    Код (Text):
    1.     push    offset CurNumbBuff
    иначе получается, что функцию ReadFile просят прочитать байт по адресу, заданному в переменной CurNumbBuff, а имеется в виду, что прочитать байт нужно в саму переменную CurNumbBuff.
     
  8. undsoft

    undsoft New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2008
    Сообщения:
    3
    Тупая ошибка :/ спасибо