<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=209083&amp;view=findpost&amp;p=1753643</guid>
        <pubDate>Tue, 06 Nov 2007 08:50:00 +0000</pubDate>
        <title>Узнать состояния потока (suspended или resume) с помощью API-функции</title>
        <link>https://forum.sources.ru/index.php?showtopic=209083&amp;view=findpost&amp;p=1753643</link>
        <description><![CDATA[Rose: В общем, как и обещал, реализация второго пункта без Resume/Suspend, а прямо на лету :) На этот раз даже с проверками на ошибки. &quot;Полезные&quot; здесь функции IsThreadSuspended и GetThreadIdByHandle, остальные - просто рабочие.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">uses SysConst, JwaNative, JwaWinType, JwaNtStatus;</div><div class="code_line">&nbsp;</div><div class="code_line">function NtErrorMessage(Code: NTSTATUS): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;hMod: Cardinal;</div><div class="code_line">&nbsp;&nbsp;Buffer: array[0..255] of Char;</div><div class="code_line">&nbsp;&nbsp;Len: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;hMod:=GetModuleHandle(ntdll);</div><div class="code_line">&nbsp;&nbsp;Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or</div><div class="code_line">&nbsp;&nbsp; &nbsp;FORMAT_MESSAGE_ARGUMENT_ARRAY or FORMAT_MESSAGE_FROM_HMODULE, Pointer(hMod), Code, 0, Buffer,</div><div class="code_line">&nbsp;&nbsp; &nbsp;SizeOf(Buffer), nil);</div><div class="code_line">&nbsp;&nbsp;while (Len &#62; 0) and (Buffer[Len - 1] in [#0..#32, &#39;.&#39;]) do Dec(Len);</div><div class="code_line">&nbsp;&nbsp;SetString(Result, Buffer, Len);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function NtSuccess(Code: NTSTATUS): Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result:=Code &#62;= 0;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure NtCheck(Code: NTSTATUS);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if not NtSuccess(Code) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;raise EOSError.CreateResFmt(@SOSError, [Code,NtErrorMessage(Code)]);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetSystemInfoTable(ASystemInformationClass: SYSTEM_INFORMATION_CLASS;</div><div class="code_line">&nbsp;&nbsp;out Info: Pointer; out Size: Cardinal): NTSTATUS;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;SystemInfo: TSystemInfo;</div><div class="code_line">&nbsp;&nbsp;ReturnSize: Cardinal;</div><div class="code_line">&nbsp;&nbsp;ContinueFlag: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;GetSystemInfo(SystemInfo);</div><div class="code_line">&nbsp;&nbsp;Size:=SystemInfo.dwPageSize;</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;Info:=VirtualAlloc(nil,Size,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Info = nil then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;RaiseLastOSError;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result:=NtQuerySystemInformation(ASystemInformationClass,Info,Size,@ReturnSize);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ContinueFlag:=Result = STATUS_INFO_LENGTH_MISMATCH;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ContinueFlag then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Win32Check(VirtualFree(Info,0,MEM_RELEASE));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if ReturnSize = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Size:=Size + SystemInfo.dwPageSize</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Size:=ReturnSize;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;until not ContinueFlag;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetThreadIdByHandle(Handle: THandle): Cardinal;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Info: _THREAD_BASIC_INFORMATION;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;NtCheck(NtQueryInformationThread(Handle,ThreadBasicInformation,@Info,</div><div class="code_line">&nbsp;&nbsp; &nbsp;SizeOf(_THREAD_BASIC_INFORMATION),nil));</div><div class="code_line">&nbsp;&nbsp;Result:=Info.ClientId.UniqueThread;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function IsThreadSuspended(ThreadID: Cardinal): Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Info, Entry: Pointer;</div><div class="code_line">&nbsp;&nbsp;Size, i: Cardinal;</div><div class="code_line">&nbsp;&nbsp;ContinueFlag: Boolean;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result:=false;</div><div class="code_line">&nbsp;&nbsp;NtCheck(GetSystemInfoTable(SystemProcessesAndThreadsInformation,Info,Size));</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;Entry:=Info;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ContinueFlag:=true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while ContinueFlag do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for i:=0 to PSYSTEM_PROCESSES(Entry)^.ThreadCount - 1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if PSYSTEM_PROCESSES(Entry)^.Threads[i].ClientId.UniqueThread = ThreadID</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result:=PSYSTEM_PROCESSES(Entry)^.Threads[i].WaitReason = Suspended;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ContinueFlag:=false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (PSYSTEM_PROCESSES(Entry)^.NextEntryDelta &#60;&#62; 0) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Cardinal(Entry):=Cardinal(Entry) + PSYSTEM_PROCESSES(Entry)^.NextEntryDelta</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ContinueFlag:=false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;VirtualFree(Info,0,MEM_RELEASE);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Rose</author>
        <category>Системные функции, WinAPI, работа с железом</category>
      </item>
	
      </channel>
      </rss>
	