DuplicateHandle

Тема в разделе "WASM.WIN32", создана пользователем cresta, 4 янв 2006.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    По мотивам Ms Rem: a-la OpenProcessEx


    Код (Text):
    1. OpenProcessEx proc uses ebx dwProcessId: DWORD, idCSRSS:DWORD
    2.     LOCAL ProcessInfo           :PROCESS_BASIC_INFORMATION
    3.     LOCAL hCSRSS                :DWORD
    4.     LOCAL dupHandle             :DWORD
    5.     LOCAL cnt                   :DWORD
    6.     LOCAL result                :DWORD
    7.     LOCAL curHandle             :DWORD
    8.     LOCAL curPID                :DWORD
    9.    
    10.     mov     result,0
    11.     invoke  GetCurrentProcessId
    12.     mov     curPID,eax
    13.     invoke  OpenProcess, PROCESS_DUP_HANDLE, FALSE, curPID
    14.     mov     curHandle,eax
    15.     invoke  OpenProcess, PROCESS_DUP_HANDLE, FALSE, idCSRSS
    16.     mov     hCSRSS,eax      
    17.     test    eax,eax
    18.     jz      _ret
    19.     invoke  GetInfoTable, SystemHandleInformation
    20.     test    eax,eax
    21.     jz      _ret
    22.     mov     ebx,eax
    23.     assume  ebx : ptr SYSTEM_HANDLE_INFORMATION_EX
    24.     mov     cnt,0
    25.  _loop:
    26.     mov     eax,cnt
    27.     mov     ecx,sizeof (SYSTEM_HANDLE_INFORMATION)
    28.     mul     ecx
    29.     lea     edx,[ebx+eax+4]
    30.     assume  edx : ptr SYSTEM_HANDLE_INFORMATION
    31.     cmp     [edx].ObjectTypeNumber,5
    32.     jne     @F
    33.     mov     eax,[edx].ProcessId
    34.     cmp     eax, idCSRSS
    35.     jne     @F
    36.     invoke  DuplicateHandle, hCSRSS, [edx].Handle, curHandle, addr dupHandle, NULL, FALSE, DUPLICATE_SAME_ACCESS
    37.     .if     (eax)
    38.         invoke  ZwQueryInformationProcess, dupHandle, ProcessBasicInformation, addr ProcessInfo, sizeof(PROCESS_BASIC_INFORMATION), 0
    39.         mov     eax,dwProcessId
    40.         .if     (eax==ProcessInfo.UniqueProcessId)
    41.             invoke  VirtualFree, ebx, 0, MEM_RELEASE
    42.             invoke  CloseHandle, hCSRSS
    43.             invoke  CloseHandle, curHandle
    44.             mov     eax,dupHandle
    45.             ret
    46.         .else
    47.             invoke CloseHandle, dupHandle
    48.         .endif
    49.     .endif
    50.     @@:
    51.     inc     cnt
    52.     mov     eax,[ebx].NumberOfHandles
    53.     cmp     cnt,eax
    54.     jl      _loop
    55.    
    56.     invoke  VirtualFree, ebx, 0, MEM_RELEASE
    57.     invoke  CloseHandle, hCSRSS
    58.     invoke  CloseHandle, curHandle
    59. _ret:
    60.     mov     eax,result  
    61.     ret
    62.  
    63. OpenProcessEx endp




    На вызов DuplicateHandle выдаёт ноль и GetLastError=Неверная попытка доступа к адресу памяти

    Какой параметр неверный - не найду никак :dntknw: Единственный адрес памяти, передаваемый в ф-цию - addr dupHandle (на стеке). Что в нем неверного?
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    [ebx].Handle оказался вордом.