2017-01-26 5 views
1

QueueUserApc()を使用しますが、0を返し、GetLastError()は6を返します。無効なハンドルです。 handle - 関数QueueUserApc()の2番目のパラメータですが、OpenThread()によって返されました。QueueUserApc()が返されたハンドルが無効であると判断します

コードの一部:コール機能上記

void WINAPI My_IDtoHandle(IN PDWORD IDArray, 
          IN DWORD dwNumber, 
          OUT PHANDLE * Thread_Handle_Array) 
{ 
    PHANDLE handlearray; 
    DWORD count = 0; 

    handlearray = (PHANDLE)HeapAlloc(GetProcessHeap(), 
            HEAP_ZERO_MEMORY, 
            dwNumber*sizeof(HANDLE)); 
    for (; count < dwNumber; count++) 
    { 
     handlearray[count] = OpenThread(THREAD_ALL_ACCESS, 
             FALSE, 
             IDArray[count]); 
     if (handlearray[count] == NULL) 
      printf("Open the thread-%d is failed!\n\n", IDArray[count]); 
    } 
    *Thread_Handle_Array = handlearray; 
    return; 
} 

result = QueueUserAPC((PAPCFUNC)SetEvent, 
         Thread_Handle_Array[count], 
         (ULONG_PTR)(Target_Event_Handle_Array + count)); 
if (result == 0) 
{ 
    printf("The inserting of the %dth function-SetEvent is failed!\n\n", count + 1); 
    printf("The error code is %d\n\n", GetLastError()); 
} 

そしてOpenThreadが返されたハンドルはストラングです:

enter image description here

+0

あなた自身またはリモートプロセスのスレッドを開いていますか? – Ari0nhh

+0

なぜ 'Number'と' dwNumber'が引数を分けるのですか?あなたは[mcve]を投稿できますか? 'QueueUserAPC'に渡されるハンドルが実際に' OpenThread'から返されたハンドルであることをデバッガでチェックしましたか? –

+0

@ Ari0nhhリモートプロセス – nima

答えて

1

それはと思われます問題は、APCを64ビットスレッドにキューイングしようとしました。 32ビットスレッド

ドキュメントは言う:同様

、64ビットプロセスが32ビットプロセスまたはその逆にAPCをキューに入れる場合は、アドレスが不正確になり、ターゲットアプリケーションがクラッシュします。

... 7年前にthis USENET postに記載されているバグレポートに応じて明らかに追加されました。その時点では、QueueUserAPC()への呼び出しはすべてERROR_INVALID_FUNCTIONで失敗しますが、ターゲットスレッドもクラッシュするようです。

ERROR_INVALID_HANDLEを明示的にブロックしてこの問題を後で解決した可能性があります。

関連する問題