• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-60  評論-262  文章-1  trackbacks-0
            1. 根據(jù)線程ID找出其所在的模塊名

            #define   WIN32_LEAN_AND_MEAN  
            #define   _WIN32_WINNT   0x400  
            #include   
            <stdio.h>  
            #include   
            <tchar.h>  
            #include   
            <locale.h>  
            #include   
            <windows.h>  

            #include 
            <psapi.h>
            #pragma comment(lib, 
            "psapi.lib")

            #include   
            <Tlhelp32.h>  


            //  
            //   Thread   Information   Classes  
            //  

            typedef   
            enum   _THREADINFOCLASS   {  
                    ThreadBasicInformation,  
                    ThreadTimes,  
                    ThreadPriority,  
                    ThreadBasePriority,  
                    ThreadAffinityMask,  
                    ThreadImpersonationToken,  
                    ThreadDescriptorTableEntry,  
                    ThreadEnableAlignmentFaultFixup,  
                    ThreadEventPair_Reusable,  
                    ThreadQuerySetWin32StartAddress,  
                    ThreadZeroTlsCell,  
                    ThreadPerformanceCount,  
                    ThreadAmILastThread,  
                    ThreadIdealProcessor,  
                    ThreadPriorityBoost,  
                    ThreadSetTlsArrayAddress,  
                    ThreadIsIoPending,  
                    ThreadHideFromDebugger,  
                    ThreadBreakOnTermination,  
                    MaxThreadInfoClass  
            }   THREADINFOCLASS;  

            typedef 
            struct _CLIENT_ID {  
                HANDLE   UniqueProcess;  
                HANDLE   UniqueThread;  
            } CLIENT_ID; 
            typedef   CLIENT_ID   
            *PCLIENT_ID;  

            typedef   
            struct   _THREAD_BASIC_INFORMATION   {   //   Information   Class   0  
                LONG        ExitStatus;  
                PVOID       TebBaseAddress;  
                CLIENT_ID   ClientId;  
                LONG        AffinityMask;  
                LONG        Priority;  
                LONG        BasePriority;  
            }   THREAD_BASIC_INFORMATION,   
            *PTHREAD_BASIC_INFORMATION;  

            typedef LONG (__stdcall 
            * PFN_ZwQueryInformationThread)(  
                                                                   IN   HANDLE   ThreadHandle,  
                                                                   IN   THREADINFOCLASS   ThreadInformationClass,  
                                                                   OUT   PVOID   ThreadInformation,  
                                                                   IN   ULONG   ThreadInformationLength,  
                                                                   OUT   PULONG   ReturnLength   OPTIONAL  
                                                                   );
            typedef LONG (__stdcall 
            * PFN_RtlNtStatusToDosError)(IN ULONG status);
            typedef DWORD (__stdcall 
            * PFN_RtlGetLastWin32Error)();


            EXTERN_C PFN_ZwQueryInformationThread pfn_ZwQueryInformationThread 
            = NULL; 
            EXTERN_C PFN_RtlNtStatusToDosError  pfn_RtlNtStatusToDosError 
            = NULL;
            EXTERN_C PFN_RtlGetLastWin32Error  pfn_RtlGetLastWin32Error 
            = NULL;

            BOOL ShowThreadInfo (DWORD tid)  
            {  
                THREAD_BASIC_INFORMATION tbi 
            = { 0 };  
                PVOID   startaddr 
            = NULL;  
                LONG    status 
            = 0;  
                HANDLE  hThread
            =NULL, process=NULL;  
                TCHAR   modname   [
            0x100= { 0 }; 
                BOOL bResult 
            = FALSE;

                
            do 
                {
                    hThread 
            = OpenThread(THREAD_ALL_ACCESS, FALSE, tid);  
                    
            if (hThread == NULL) {
                        SetLastError(pfn_RtlGetLastWin32Error());
                        
            break;
                    }
                    
                    status   
            =   pfn_ZwQueryInformationThread   (hThread,    
                        ThreadQuerySetWin32StartAddress,    
                        
            &startaddr,    
                        
            sizeof   (startaddr),    
                        NULL);  
                    
            if (status < 0) {
                        SetLastError(pfn_RtlNtStatusToDosError(status));
                        
            break;
                    };  
                    
                    _tprintf(TEXT(
            "Thread %08x  start address is %p\n"), tid, startaddr);  
                    
                    status 
            = pfn_ZwQueryInformationThread(hThread,    
                        ThreadBasicInformation,    
                        
            &tbi,    
                        
            sizeof   (tbi),    
                        NULL);  
                    
                    
            if (status < 0)  
                    {  
                        SetLastError(pfn_RtlNtStatusToDosError(status));
                        
            break;
                    };  
                    
                    _tprintf   (TEXT   (
            "Thread %08x 's process ID is %08x\n"),    
                        tid,    
                        (DWORD)tbi.ClientId.UniqueProcess);  
                    
                    process   
            =   OpenProcess   (PROCESS_ALL_ACCESS,    
                        FALSE,    
                        (DWORD)tbi.ClientId.UniqueProcess);  
                    
                    
            if (process == NULL) { 
                        SetLastError(pfn_RtlGetLastWin32Error()); 
                        
            break;
                    };  
                    
                    GetModuleFileNameEx(process, NULL, modname, 
            0x100);  
                    _tprintf(TEXT(
            "Thread %08x Located in Process Image %s\n"), tid, modname);
                    
                    GetMappedFileName(process, startaddr, modname, 
            0x100);  
                    _tprintf(TEXT(
            "Thread %08x Located in module \"%s\"\n"), tid, modname);
                    
                    bResult 
            = TRUE;
                } 
            while (FALSE);
                
                
            if (process) {
                    CloseHandle(process);
                }
                
            if (hThread) {
                    CloseHandle(hThread);  
                }
                
                
            return   TRUE;  
            };  

            int   main   (void)  
            {  
                HINSTANCE hNTDLL 
            = NULL;
                HANDLE h 
            = NULL;
                THREADENTRY32 te 
            = { sizeof(te) };  

                setlocale(LC_ALL, 
            ".ACP");  
                hNTDLL 
            = GetModuleHandle(TEXT("ntdll"));  
                pfn_ZwQueryInformationThread 
            = (PFN_ZwQueryInformationThread)
                    GetProcAddress(hNTDLL, 
            "ZwQueryInformationThread");  
                pfn_RtlNtStatusToDosError 
            = (PFN_RtlNtStatusToDosError)
                    GetProcAddress(hNTDLL, 
            "RtlNtStatusToDosError"); 
                pfn_RtlGetLastWin32Error 
            = (PFN_RtlGetLastWin32Error)
                    GetProcAddress(hNTDLL, 
            "RtlGetLastWin32Error");


                h   
            =   CreateToolhelp32Snapshot   (TH32CS_SNAPTHREAD,   0);  
                te.dwSize   
            =   sizeof   (te);  
                
            if(Thread32First(h, &te))  
                {  
                    
            do  
                    {  
                        
            if   (ShowThreadInfo   (te.th32ThreadID))  
                        {  
                        }  
                        
            else  
                        {  
                            _tprintf(TEXT(
            "Can't get thread %08x information, Error code is %d\r\n"),    
                                te.th32ThreadID,   GetLastError());  
                        };  
                    }   
            while   (Thread32Next   (h,   &te));  
                };  
                CloseHandle   (h);  
            }

            2. 獲取線程當前狀態(tài), 是掛起還是終止, 沒有直接的 API. 這段代碼比較實用
            #include <stdio.h>
            #include 
            <windows.h>
            #include 
            <winbase.h>
            #include 
            <ntsecapi.h>


            #define UNICODE
            #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
            #define STATUS_SUCCESS              ((NTSTATUS) 0x00000000)
            #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004)
            #define SystemProcessesAndThreadsInformation    5
            #define NTAPI    __stdcall

            typedef 
            enum _THREAD_STATE
            {
                StateInitialized,
                StateReady,
                StateRunning,
                StateStandby,
                StateTerminated,
                StateWait,
                StateTransition,
                StateUnknown
            }THREAD_STATE;

            typedef 
            enum _KWAIT_REASON
            {
                Executive,
                FreePage,
                PageIn,
                PoolAllocation,
                DelayExecution,
                Suspended,
                UserRequest,
                WrExecutive,
                WrFreePage,
                WrPageIn,
                WrPoolAllocation,
                WrDelayExecution,
                WrSuspended,
                WrUserRequest,
                WrEventPair,
                WrQueue,
                WrLpcReceive,
                WrLpcReply,
                WrVirtualMemory,
                WrPageOut,
                WrRendezvous,
                Spare2,
                Spare3,
                Spare4,
                Spare5,
                Spare6,
                WrKernel,
                MaximumWaitReason
            }KWAIT_REASON;

            typedef NTSTATUS (WINAPI 
            *PNTRAISE)(NTSTATUS,
                                                ULONG,
                                                ULONG,
                                                PULONG,
                                                UINT,
                                                PULONG);   


            typedef LONG NTSTATUS;
            typedef LONG    KPRIORITY;

            typedef 
            struct _CLIENT_ID {
                DWORD        UniqueProcess;
                DWORD        UniqueThread;
            } CLIENT_ID, 
            * PCLIENT_ID;


            typedef 
            struct _VM_COUNTERS {
                SIZE_T        PeakVirtualSize;
                SIZE_T        VirtualSize;
                ULONG        PageFaultCount;
                SIZE_T        PeakWorkingSetSize;
                SIZE_T        WorkingSetSize;
                SIZE_T        QuotaPeakPagedPoolUsage;
                SIZE_T        QuotaPagedPoolUsage;
                SIZE_T        QuotaPeakNonPagedPoolUsage;
                SIZE_T        QuotaNonPagedPoolUsage;
                SIZE_T        PagefileUsage;
                SIZE_T        PeakPagefileUsage;
            } VM_COUNTERS;


            typedef 
            struct _SYSTEM_THREAD_INFORMATION {
                LARGE_INTEGER   KernelTime;
                LARGE_INTEGER   UserTime;
                LARGE_INTEGER   CreateTime;
                ULONG            WaitTime;
                PVOID            StartAddress;
                CLIENT_ID        ClientId;
                KPRIORITY        Priority;
                KPRIORITY        BasePriority;
                ULONG            ContextSwitchCount;
                LONG            State;
                LONG            WaitReason;
            } SYSTEM_THREAD_INFORMATION, 
            * PSYSTEM_THREAD_INFORMATION;



            typedef 
            struct _SYSTEM_PROCESS_INFORMATION {
                ULONG            NextEntryDelta;
                ULONG            ThreadCount;
                ULONG            Reserved1[
            6];
                LARGE_INTEGER   CreateTime;
                LARGE_INTEGER   UserTime;
                LARGE_INTEGER   KernelTime;
                UNICODE_STRING ProcessName;
                KPRIORITY        BasePriority;
                ULONG            ProcessId;
                ULONG            InheritedFromProcessId;
                ULONG            HandleCount;
                ULONG            Reserved2[
            2];
                VM_COUNTERS        VmCounters;
                IO_COUNTERS        IoCounters;
                SYSTEM_THREAD_INFORMATION Threads[
            5];
            } SYSTEM_PROCESS_INFORMATION, 
            * PSYSTEM_PROCESS_INFORMATION;



            typedef DWORD (WINAPI
            * PQUERYSYSTEM)(UINT, PVOID, DWORD,PDWORD);

            /************************************************************************/
            /* 函數(shù)說明:
               參數(shù):dwThreadID 代表線程ID ,這里主要是驗證線程的ID
                         szProcessName,表示線程所在的進程名

            返回值:
                   true: 表示線程被掛起
                   false: 表示線程正常。

            */
            /************************************************************************/

            BOOL IsThreadSuspend(DWORD dwThreadID,wchar_t 
            *szProcessName)
            {
                ULONG cbBuffer 
            = 0x5000;
               
                BOOL bRet 
            = FALSE;

                LPVOID pBuffer 
            = NULL;
                NTSTATUS Status;


                DWORD b
            =0;

                PQUERYSYSTEM NtQuerySystemInformation;
                PSYSTEM_PROCESS_INFORMATION pInfo ;

                NtQuerySystemInformation 
            = (PQUERYSYSTEM) GetProcAddress(
                    LoadLibrary( 
            "ntdll.dll" ),
                    
            "NtQuerySystemInformation" );

                
            do
                {
                    pBuffer 
            = malloc(cbBuffer);
                    
            if (pBuffer == NULL)
                    {
                        
            break;
                    }

                    Status 
            = NtQuerySystemInformation(
                        SystemProcessesAndThreadsInformation,
                        pBuffer, cbBuffer, NULL);

                    
            if (Status == STATUS_INFO_LENGTH_MISMATCH)
                    {
                        free(pBuffer);
                        cbBuffer 
            *= 2;
                    }
                    
            else if (!NT_SUCCESS(Status))
                    {
                        free(pBuffer);
                    }

                }   
            while (Status == STATUS_INFO_LENGTH_MISMATCH);


                pInfo 
            = (PSYSTEM_PROCESS_INFORMATION)pBuffer;

                
            for (;;)
                {


                    
            if (pInfo->NextEntryDelta == 0)
                        
            break;
                    
            if(pInfo->ProcessName.Buffer!=NULL &&
                        
            !_wcsicmp(pInfo->ProcessName.Buffer,szProcessName))
                    {

                        
            for(b=0;b<pInfo->ThreadCount ;b++)
                        {
                            
            if(pInfo->Threads[b].ClientId.UniqueThread == dwThreadID ) //找到線程              
                            {

                                
            if(pInfo->Threads[b].State == StateWait && pInfo->Threads[b].WaitReason == Suspended) //線程被掛起
                                {
                                    bRet 
            = TRUE;
                                    
            break;
                                }
                            }
                        }
                        
            break;
                   
                    }
                    pInfo 
            = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo) +    pInfo->NextEntryDelta);
                }

                free(pBuffer);
                
            return bRet;
            }   


            /**************************************************************/
            /*判斷線程是否被終止 , 如果終止返回FALSE,如果還活著返回TRUE
            /*************************************************************
            */

            BOOL IsThreadAlive(DWORD dwThreadID)
            {
                BOOL bRet 
            = FALSE;
                DWORD ExitCode 
            = 0;

                HANDLE hThread 
            = OpenThread(THREAD_QUERY_INFORMATION,FALSE,dwThreadID);
                
            if(hThread != NULL)
                {
                    
            if(GetExitCodeThread(hThread,&ExitCode))
                    {
                        
            if( ExitCode == STILL_ACTIVE)
                            bRet 
            = TRUE;
                    }

                    CloseHandle(hThread);
                }

                
            return bRet;
            }

            int _tmain(int argc, _TCHAR* argv[])
            {

               
                BOOL bRET 
            =IsThreadSuspend(2320,L"EXPLORER.EXE");


                
            if(bRET)
                {
                    printf(
            " 2320線程被掛起了!");
                }
                
            return 0;
            }


            posted on 2009-07-22 10:29 free2000fly 閱讀(4913) 評論(0)  編輯 收藏 引用
            久久久久亚洲AV成人网人人网站 | 无夜精品久久久久久| 国产亚洲综合久久系列| 狠狠综合久久综合88亚洲| 久久精品亚洲精品国产欧美| 国产精品美女久久久免费| 成人久久精品一区二区三区| 久久久久亚洲av无码专区喷水| 亚洲国产精品无码久久98| 亚洲国产精品无码久久SM| 青草国产精品久久久久久| 色婷婷综合久久久久中文| 亚洲αv久久久噜噜噜噜噜| 亚洲成色WWW久久网站| 精品蜜臀久久久久99网站| 香港aa三级久久三级| 久久精品国产精品亜洲毛片 | 婷婷久久精品国产| 一本大道久久东京热无码AV| 久久精品卫校国产小美女| 久久夜色精品国产网站| 久久精品国产免费| 国产精品无码久久四虎| 伊人久久大香线蕉综合5g| 日本久久久久亚洲中字幕| 久久这里只精品国产99热| 亚洲国产精品无码久久九九 | 热99RE久久精品这里都是精品免费| 大香伊人久久精品一区二区 | 91精品国产乱码久久久久久| 91精品国产91久久久久久| 模特私拍国产精品久久| 久久精品中文字幕无码绿巨人| 香蕉久久夜色精品国产小说| 2021最新久久久视精品爱 | 久久er热视频在这里精品| 久久人人爽人人爽人人片AV麻豆 | 国产一区二区三区久久精品| 欧洲性大片xxxxx久久久| A狠狠久久蜜臀婷色中文网| 久久九九免费高清视频|