<?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=152912&amp;view=findpost&amp;p=1247731</guid>
        <pubDate>Fri, 01 Sep 2006 21:01:47 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1247731</link>
        <description><![CDATA[Krid: В гугле поискать не пробовал?  :) <br>http://www.google.ru/search?q=NtFsControlFile&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ru:official]]></description>
        <author>Krid</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1247632</guid>
        <pubDate>Fri, 01 Sep 2006 18:01:55 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1247632</link>
        <description><![CDATA[dimon-max: На сколько я понимаю, &#39;NtFsControlFile&#39; - недокументированная функция Windows. Где-то можно скачать описание таких функций в .pas или .h? Может кто знает.]]></description>
        <author>dimon-max</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1247300</guid>
        <pubDate>Fri, 01 Sep 2006 12:38:58 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1247300</link>
        <description><![CDATA[Rouse_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=152912&view=findpost&p=1246545'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Arazel &#064; <time class="tag-quote__quoted-time" datetime="2006-09-01T07:38:26+00:00">01.09.06, 07:38</time></span><div class='quote '>Все ведет к тому:<br>
<br>
Любая дисковая утилита должна перед тем как записать на носитель<br>
она должна заблокировать носитель для записи<br>
Но OC также закрывает доступ&#33; <br>
Хотя досуп с ядра всегда есть в обоих случаях  </div></div><br>
Что сказал?]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1246545</guid>
        <pubDate>Fri, 01 Sep 2006 07:38:26 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1246545</link>
        <description><![CDATA[Arazel: Все ведет к тому:<br><br>Любая дисковая утилита должна перед тем как записать на носитель<br>она должна заблокировать носитель для записи<br>Но OC также закрывает доступ&#33; <br>Хотя досуп с ядра всегда есть в обоих случаях :)]]></description>
        <author>Arazel</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1246450</guid>
        <pubDate>Fri, 01 Sep 2006 06:43:40 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1246450</link>
        <description><![CDATA[Rouse_: Абсолютно согласен  :yes:]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1245601</guid>
        <pubDate>Thu, 31 Aug 2006 12:53:52 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1245601</link>
        <description><![CDATA[Irp: Вы правы&#33; Но гораздо приятней и информативней читать FSCTL_DISMOUNT_VOLUME, нежели гадать что такое 0x00090020 &#33; ;)]]></description>
        <author>Irp</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1245331</guid>
        <pubDate>Thu, 31 Aug 2006 11:27:16 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1245331</link>
        <description><![CDATA[Rouse_: Ну если он измениться, то всеравно, как минимум, придется пересобирать исходник :)]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1245253</guid>
        <pubDate>Thu, 31 Aug 2006 10:58:58 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1245253</link>
        <description><![CDATA[Irp: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>NtFsControlFile(f, 0,nil,nil, @SB, &#036;00090020,nil,0,nil,0)=0);</div></div><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">NtFsControlFile(f, 0,nil,nil, @SB, FSCTL_DISMOUNT_VOLUME, nil,0,nil,0)=0);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Потом в будуших версиях Винды будите долго думать почему не работает...если вдруг IOCTL код изменится...]]></description>
        <author>Irp</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1245178</guid>
        <pubDate>Thu, 31 Aug 2006 10:26:36 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1245178</link>
        <description><![CDATA[dimon-max: Наконец-то с помощья дебаггера и IDAPro я разобрался как работает &quot;chkdsk.exe&quot;&#33; По началу думал, что он знает все эти дескрипторы, а потом их закрывает. Но оказалось гораздо жухе. Вот структура: chkdsk.exe =&gt; vfat.dll =&gt; ifsutil.dll =&gt; ntdll.dll.<br>
<br>
Вот, что делается до того как написать &quot;Том отключен.  ВCE ОТКРЫТЫЕ ДЕСКРИПТОРЫ ТОМА СТАЛИ НЕВЕРНЫ.&quot; (перевёл на Delphi, упрощённо):<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">type</div><div class="code_line">&nbsp;WSTRING = record</div><div class="code_line">&nbsp;&nbsp;l0, l1 : Word;</div><div class="code_line">&nbsp;&nbsp;Str &nbsp; &nbsp;: PWideChar;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;PWSTRING = ^WSTRING;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;OBJECT_ATTRIBUTES = record</div><div class="code_line">&nbsp;&nbsp;Length: ULONG;</div><div class="code_line">&nbsp;&nbsp;RootDirectory: THandle;</div><div class="code_line">&nbsp;&nbsp;ObjectName: PWSTRING;</div><div class="code_line">&nbsp;&nbsp;Attributes: ULONG;</div><div class="code_line">&nbsp;&nbsp;SecurityDescriptor: PSECURITY_DESCRIPTOR;</div><div class="code_line">&nbsp;&nbsp;SecurityQualityOfService: Pointer; ///PSECURITY_QUALITY_OF_SERVICE;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;IO_STATUS_BLOCK = record</div><div class="code_line">&nbsp;&nbsp;Status: Integer; ///NTSTATUS;</div><div class="code_line">&nbsp;&nbsp;Pointer: Pointer; ///PVOID;</div><div class="code_line">&nbsp;&nbsp;Information: ^ULONG;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;</div><div class="code_line">&nbsp;</div><div class="code_line">Function NtOpenFile(</div><div class="code_line">&nbsp;FileHandle: PHANDLE;</div><div class="code_line">&nbsp;DesiredAccess: ACCESS_MASK;</div><div class="code_line">&nbsp;ObjectAttributes: POBJECT_ATTRIBUTES;</div><div class="code_line">&nbsp;IoStatusBlock: PIO_STATUS_BLOCK; // out</div><div class="code_line">&nbsp;ShareAccess: ULONG;</div><div class="code_line">&nbsp;OpenOptions: ULONG): Integer; stdcall; external &#39;ntdll.dll&#39; name &#39;NtOpenFile&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">Function NtFsControlFile(</div><div class="code_line">&nbsp;&nbsp;FileHandle: THandle;</div><div class="code_line">&nbsp;&nbsp;Event: THandle;</div><div class="code_line">&nbsp;&nbsp;ApcRoutine: Pointer; ///PIO_APC_ROUTINE;</div><div class="code_line">&nbsp;&nbsp;ApcContext: Pointer;</div><div class="code_line">&nbsp;&nbsp;IoStatusBlock: PIO_STATUS_BLOCK; // out</div><div class="code_line">&nbsp;&nbsp;FsControlCode: ULONG;</div><div class="code_line">&nbsp;&nbsp;InputBuffer: Pointer;</div><div class="code_line">&nbsp;&nbsp;InputBufferLength: ULONG;</div><div class="code_line">&nbsp;&nbsp;OutputBuffer: Pointer; // out</div><div class="code_line">&nbsp;&nbsp;OutputBufferLength: ULONG): Integer; stdcall; external &#39;ntdll.dll&#39; name &#39;NtFsControlFile&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">Function NtClose(FileHandle: THandle): Integer; stdcall; external &#39;ntdll.dll&#39; name &#39;NtClose&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">// Закрывает дескрипторы устройства, возвращает успешность операции.</div><div class="code_line">// &nbsp;пример вызова для диска &quot;E&quot;: DismountVolume(&#39;\??\E:&#39;)</div><div class="code_line">Function DismountVolume(DriveStr: PWideChar): Boolean;</div><div class="code_line">Var</div><div class="code_line">&nbsp;f &nbsp; : HFile;</div><div class="code_line">&nbsp;OA &nbsp;: OBJECT_ATTRIBUTES;</div><div class="code_line">&nbsp;SB &nbsp;: IO_STATUS_BLOCK;</div><div class="code_line">&nbsp;sX &nbsp;: WSTRING;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;sX.l0:=Length(DriveStr)*2;</div><div class="code_line">&nbsp;sX.l1:=sX.l0+2;</div><div class="code_line">&nbsp;sX.Str:=DriveStr;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;OA.Length:=sizeof(OBJECT_ATTRIBUTES);</div><div class="code_line">&nbsp;OA.RootDirectory:=0;</div><div class="code_line">&nbsp;OA.ObjectName:=@sX;</div><div class="code_line">&nbsp;OA.Attributes:=;</div><div class="code_line">&nbsp;OA.SecurityDescriptor:=nil;</div><div class="code_line">&nbsp;OA.SecurityQualityOfService:=nil;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if( NtOpenFile(@f, 0003, @OA, @SB, 3, ) &#60;&#62; 0 )then</div><div class="code_line">&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp;Result:=False;</div><div class="code_line">&nbsp;&nbsp;Exit;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;Result:=(NtFsControlFile(f, 0,nil,nil, @SB, {text}090020,nil,0,nil,0)=0);</div><div class="code_line">&nbsp;NtClose(f);</div><div class="code_line">End;</div></ol></div></div></div></div><br>
<br>
Для меня - это бесполезный код. Но может кому-то понадобится (например, для удаления неудаляющихся файлов). С диском &#39;C:&#39; почему-то не работает.]]></description>
        <author>dimon-max</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1242689</guid>
        <pubDate>Wed, 30 Aug 2006 06:48:36 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1242689</link>
        <description><![CDATA[Rouse_: Вот так:<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">////////////////////////////////////////////////////////////////////////////////</div><div class="code_line">//</div><div class="code_line">// &nbsp;****************************************************************************</div><div class="code_line">// &nbsp;* Unit Name : Unit15</div><div class="code_line">// &nbsp;* Purpose &nbsp; : Перечисление всех открытых файлов в системе</div><div class="code_line">// &nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (до которых получилось достучаться)</div><div class="code_line">// &nbsp;* Author &nbsp; &nbsp;: Александр (Rouse_) Багель</div><div class="code_line">// &nbsp;* Version &nbsp; : 1.00</div><div class="code_line">// &nbsp;****************************************************************************</div><div class="code_line">//</div><div class="code_line">&nbsp;</div><div class="code_line">unit Unit15;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,</div><div class="code_line">&nbsp;&nbsp;Dialogs, StdCtrls, ComCtrls;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TForm15 = class(TForm)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Button1: TButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Memo1: TMemo;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ProgressBar1: TProgressBar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Button1Click(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure ShowLockedProcess(FileName: String);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Form15: TForm15;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;NT_STATUS = Cardinal;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TFileDirectoryInformation = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;NextEntryOffset: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FileIndex: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreationTime: LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;LastAccessTime: LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;LastWriteTime: LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ChangeTime: LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;EndOfFile: LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;AllocationSize: LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FileAttributes: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FileNameLength: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FileName: array[0..0] of WideChar;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;FILE_DIRECTORY_INFORMATION = TFileDirectoryInformation;</div><div class="code_line">&nbsp;&nbsp;PFileDirectoryInformation = ^TFileDirectoryInformation;</div><div class="code_line">&nbsp;&nbsp;PFILE_DIRECTORY_INFORMATION = PFileDirectoryInformation;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PSYSTEM_THREADS = ^SYSTEM_THREADS;</div><div class="code_line">&nbsp;&nbsp;SYSTEM_THREADS &nbsp;= packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;KernelTime: LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;UserTime: LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreateTime: LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WaitTime: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;StartAddress: Pointer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;UniqueProcess: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;UniqueThread: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Priority: Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;BasePriority: Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ContextSwitchCount: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;State: Longint;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WaitReason: Longint;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PSYSTEM_PROCESS_INFORMATION = ^SYSTEM_PROCESS_INFORMATION;</div><div class="code_line">&nbsp;&nbsp;SYSTEM_PROCESS_INFORMATION = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;NextOffset: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ThreadCount: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Reserved1: array [0..5] of ULONG; </div><div class="code_line">&nbsp;&nbsp; &nbsp;CreateTime: FILETIME;</div><div class="code_line">&nbsp;&nbsp; &nbsp;UserTime: FILETIME;</div><div class="code_line">&nbsp;&nbsp; &nbsp;KernelTime: FILETIME;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ModuleNameLength: WORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ModuleNameMaxLength: WORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ModuleName: PWideChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;BasePriority: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ProcessID: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InheritedFromUniqueProcessID: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HandleCount: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Reserved2 : array[0..1] of ULONG; </div><div class="code_line">&nbsp;&nbsp; &nbsp;PeakVirtualSize : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;VirtualSize : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PageFaultCount : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PeakWorkingSetSize : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WorkingSetSize : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;QuotaPeakPagedPoolUsage : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;QuotaPagedPoolUsage : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;QuotaPeakNonPagedPoolUsage : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;QuotaNonPagedPoolUsage : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PageFileUsage : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PeakPageFileUsage : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PrivatePageCount : ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReadOperationCount : LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteOperationCount : LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OtherOperationCount : LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReadTransferCount : LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteTransferCount : LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OtherTransferCount : LARGE_INTEGER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ThreadInfo: array [0..0] of SYSTEM_THREADS;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PSYSTEM_HANDLE_INFORMATION = ^SYSTEM_HANDLE_INFORMATION;</div><div class="code_line">&nbsp;&nbsp;SYSTEM_HANDLE_INFORMATION = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;ProcessId: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ObjectTypeNumber: Byte;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Flags: Byte;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Handle: Word;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pObject: Pointer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;GrantedAccess: DWORD;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PSYSTEM_HANDLE_INFORMATION_EX = ^SYSTEM_HANDLE_INFORMATION_EX;</div><div class="code_line">&nbsp;&nbsp;SYSTEM_HANDLE_INFORMATION_EX = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;NumberOfHandles: dword;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Information: array [0..0] of SYSTEM_HANDLE_INFORMATION;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PFILE_NAME_INFORMATION = ^FILE_NAME_INFORMATION;</div><div class="code_line">&nbsp;&nbsp;FILE_NAME_INFORMATION = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;FileNameLength: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FileName: array [0..MAX_PATH - 1] of WideChar;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PUNICODE_STRING = ^TUNICODE_STRING;</div><div class="code_line">&nbsp;&nbsp;TUNICODE_STRING = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;Length : WORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MaximumLength : WORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Buffer : array [0..MAX_PATH - 1] of WideChar;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;POBJECT_NAME_INFORMATION = ^TOBJECT_NAME_INFORMATION;</div><div class="code_line">&nbsp;&nbsp;TOBJECT_NAME_INFORMATION = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;Name : TUNICODE_STRING;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;</div><div class="code_line">&nbsp;&nbsp;IO_STATUS_BLOCK = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;Status: NT_STATUS;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Information: DWORD;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PGetFileNameThreadParam = ^TGetFileNameThreadParam;</div><div class="code_line">&nbsp;&nbsp;TGetFileNameThreadParam = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;hFile: THandle;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Data: array [0..MAX_PATH - 1] of Char;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Status: NT_STATUS;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;STATUS_SUCCESS = NT_STATUS({text}000000);</div><div class="code_line">&nbsp;&nbsp;STATUS_INVALID_INFO_CLASS = NT_STATUS($C0000003);</div><div class="code_line">&nbsp;&nbsp;STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004);</div><div class="code_line">&nbsp;&nbsp;STATUS_INVALID_DEVICE_REQUEST = NT_STATUS($C0000010);</div><div class="code_line">&nbsp;&nbsp;ObjectNameInformation = 1;</div><div class="code_line">&nbsp;&nbsp;FileDirectoryInformation = 1;</div><div class="code_line">&nbsp;&nbsp;FileNameInformation = 9;</div><div class="code_line">&nbsp;&nbsp;SystemProcessesAndThreadsInformation = 5;</div><div class="code_line">&nbsp;&nbsp;SystemHandleInformation = 16;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function ZwQuerySystemInformation(ASystemInformationClass: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ASystemInformation: Pointer; ASystemInformationLength: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;AReturnLength: PDWORD): NT_STATUS; stdcall; external &#39;ntdll.dll&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function NtQueryInformationFile(FileHandle: THandle;</div><div class="code_line">&nbsp;&nbsp; &nbsp;IoStatusBlock: PIO_STATUS_BLOCK; FileInformation: Pointer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Length: DWORD; FileInformationClass: DWORD): NT_STATUS;</div><div class="code_line">&nbsp;&nbsp; &nbsp;stdcall; external &#39;ntdll.dll&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function NtQueryObject(ObjectHandle: THandle;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ObjectInformationClass: DWORD; ObjectInformation: Pointer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ObjectInformationLength: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReturnLength: PDWORD): NT_STATUS; stdcall; external &#39;ntdll.dll&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function GetLongPathNameA(lpszShortPath, lpszLongPath: PChar;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cchBuffer: DWORD): DWORD; stdcall; external kernel32;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm15.Button1Click(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;ShowLockedProcess(&#39;&#39;);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm15.ShowLockedProcess(FileName: String);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function GetInfoTable(ATableType: DWORD): Pointer;</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;dwSize: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pPtr: Pointer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ntStatus: NT_STATUS;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dwSize := WORD(-1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetMem(pPtr, dwSize);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);</div><div class="code_line">&nbsp;&nbsp; &nbsp;while ntStatus = STATUS_INFO_LENGTH_MISMATCH do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dwSize := dwSize * 2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ReallocMem(pPtr, dwSize);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ntStatus = STATUS_SUCCESS then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := pPtr</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FreeMem(pPtr);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function GetFileNameThread(lpParameters: Pointer): DWORD; stdcall;</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;FileNameInfo: FILE_NAME_INFORMATION;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ObjectNameInfo: TOBJECT_NAME_INFORMATION;</div><div class="code_line">&nbsp;&nbsp; &nbsp;IoStatusBlock: IO_STATUS_BLOCK;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pThreadParam: TGetFileNameThreadParam;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dwReturn: DWORD;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(@FileNameInfo, SizeOf(FILE_NAME_INFORMATION));</div><div class="code_line">&nbsp;&nbsp; &nbsp;pThreadParam := PGetFileNameThreadParam(lpParameters)^;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := NtQueryInformationFile(pThreadParam.hFile, @IoStatusBlock,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;@FileNameInfo, MAX_PATH * 2, FileNameInformation);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Result = STATUS_SUCCESS then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := NtQueryObject(pThreadParam.hFile, ObjectNameInformation,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;@ObjectNameInfo, MAX_PATH * 2, @dwReturn);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if Result = STATUS_SUCCESS then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pThreadParam.Status := Result;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WideCharToMultiByte(CP_ACP, 0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength -</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ObjectNameInfo.Name.Length],</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ObjectNameInfo.Name.Length, @pThreadParam.Data[0],</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MAX_PATH, nil, nil);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pThreadParam.Status := STATUS_SUCCESS;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := STATUS_SUCCESS;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WideCharToMultiByte(CP_ACP, 0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@FileNameInfo.FileName[0], IoStatusBlock.Information,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@pThreadParam.Data[0],</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MAX_PATH, nil, nil);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PGetFileNameThreadParam(lpParameters)^ := pThreadParam;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ExitThread(Result);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function GetFileNameFromHandle(hFile: THandle): String;</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;lpExitCode: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pThreadParam: TGetFileNameThreadParam;</div><div class="code_line">&nbsp;&nbsp; &nbsp;hThread: THandle;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(@pThreadParam, SizeOf(TGetFileNameThreadParam));</div><div class="code_line">&nbsp;&nbsp; &nbsp;pThreadParam.hFile := hFile;</div><div class="code_line">&nbsp;&nbsp; &nbsp;hThread := CreateThread(nil, 0, @GetFileNameThread, @pThreadParam, 0, PDWORD(nil)^);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if hThread &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;case WaitForSingleObject(hThread, 100) of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WAIT_OBJECT_0:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetExitCodeThread(hThread, lpExitCode);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if lpExitCode = STATUS_SUCCESS then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := pThreadParam.Data;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WAIT_TIMEOUT:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TerminateThread(hThread, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CloseHandle(hThread);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function SetDebugPriv: Boolean;</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;Token: THandle;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tkp: TTokenPrivileges;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if OpenProcessToken(GetCurrentProcess,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if LookupPrivilegeValue(nil, PChar(&#39;SeDebugPrivilege&#39;),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tkp.Privileges[0].Luid) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tkp.PrivilegeCount := 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := AdjustTokenPrivileges(Token, False,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;DriveQueryData = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;DiskLabel: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DiskDosQuery: String;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DosQueryLen: Integer;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;hFile, hProcess: THandle;</div><div class="code_line">&nbsp;&nbsp;pHandleInfo: PSYSTEM_HANDLE_INFORMATION_EX;</div><div class="code_line">&nbsp;&nbsp;I, Drive: Integer;</div><div class="code_line">&nbsp;&nbsp;ObjectTypeNumber: Byte;</div><div class="code_line">&nbsp;&nbsp;FileDirectory, FilePath, ProcessName: String;</div><div class="code_line">&nbsp;&nbsp;SystemInformation, TempSI: PSYSTEM_PROCESS_INFORMATION;</div><div class="code_line">&nbsp;&nbsp;DosDevices: array [0..25] of DriveQueryData;</div><div class="code_line">&nbsp;&nbsp;LongFileName, TmpFileName: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;SetLength(LongFileName, MAX_PATH);</div><div class="code_line">&nbsp;&nbsp;GetLongPathNameA(PChar(FileName), @LongFileName[1], MAX_PATH);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for Drive := 0 to 25 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;DosDevices[Drive].DiskLabel := Chr(Drive + Ord(&#39;a&#39;)) + &#39;:&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(DosDevices[Drive].DiskDosQuery, MAXCHAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(@DosDevices[Drive].DiskDosQuery[1], MAXCHAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp;QueryDosDevice(PChar(DosDevices[Drive].DiskLabel),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;@DosDevices[Drive].DiskDosQuery[1], MAXCHAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DosDevices[Drive].DosQueryLen := Length(PChar(DosDevices[Drive].DiskDosQuery));</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(DosDevices[Drive].DiskDosQuery, DosDevices[Drive].DosQueryLen);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ObjectTypeNumber := 0;</div><div class="code_line">&nbsp;&nbsp;SetDebugPriv;</div><div class="code_line">&nbsp;&nbsp;hFile := CreateFile(&#39;NUL&#39;, GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);</div><div class="code_line">&nbsp;&nbsp;if hFile = INVALID_HANDLE_VALUE then RaiseLastOSError;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;pHandleInfo := GetInfoTable(SystemHandleInformation);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if pHandleInfo = nil then RaiseLastOSError;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for I := 0 to pHandleInfo^.NumberOfHandles - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if pHandleInfo^.Information[I].Handle = hFile then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if pHandleInfo^.Information[I].ProcessId = GetCurrentProcessId then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ObjectTypeNumber := pHandleInfo^.Information[I].ObjectTypeNumber;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FreeMem(pHandleInfo);</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;CloseHandle(hFile);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SystemInformation := GetInfoTable(SystemProcessesAndThreadsInformation);</div><div class="code_line">&nbsp;&nbsp;if SystemInformation &#60;&#62; nil then</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;pHandleInfo := GetInfoTable(SystemHandleInformation);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if pHandleInfo &#60;&#62; nil then</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ProgressBar1.Position := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ProgressBar1.Max := pHandleInfo^.NumberOfHandles;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for I := 0 to pHandleInfo^.NumberOfHandles - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if pHandleInfo^.Information[I].ObjectTypeNumber = ObjectTypeNumber then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;hProcess := OpenProcess(PROCESS_DUP_HANDLE, True,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pHandleInfo^.Information[I].ProcessId);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if hProcess &#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if DuplicateHandle(hProcess, pHandleInfo^.Information[I].Handle,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetCurrentProcess, @hFile, 0, False, DUPLICATE_SAME_ACCESS) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Application.Terminated then Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FilePath := GetFileNameFromHandle(hFile);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if FilePath &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FileDirectory := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for Drive := 0 to 25 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if DosDevices[Drive].DosQueryLen &#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Copy(FilePath, 1, DosDevices[Drive].DosQueryLen) =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DosDevices[Drive].DiskDosQuery then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FileDirectory := DosDevices[Drive].DiskLabel;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Delete(FilePath, 1, DosDevices[Drive].DosQueryLen);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if FileDirectory = &#39;&#39; then Continue; &nbsp; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TempSI := SystemInformation;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if TempSI^.ProcessID =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pHandleInfo^.Information[I].ProcessId then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ProcessName := TempSI^.ModuleName;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TempSI := Pointer(DWORD(TempSI) + TempSI^.NextOffset);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;until TempSI^.NextOffset = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(TmpFileName, MAX_PATH);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetLongPathNameA(PChar(FileDirectory + FilePath), @TmpFileName[1], MAX_PATH);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Memo1.Lines.Add(ProcessName + &#39;: &#39; + TmpFileName); &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle(hFile);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle(hProcess);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ProgressBar1.Position := ProgressBar1.Position + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Application.ProcessMessages;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FreeMem(pHandleInfo);</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;FreeMem(SystemInformation);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;ShowMessage(&#39;All handles found.&#39;);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
Целиком проект в аттаче...]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1242401</guid>
        <pubDate>Tue, 29 Aug 2006 21:04:17 +0000</pubDate>
        <title>Как узнать все открытые дескрипторы</title>
        <link>https://forum.sources.ru/index.php?showtopic=152912&amp;view=findpost&amp;p=1242401</link>
        <description><![CDATA[dimon-max: Когда chkdsk.exe начинает проверять диск, он закрывает на нём все открытые файлы. Можно ли самому узнать их Thandle&#39;ы и, если надо, закрыть. Существует ли какая-нибудь функция, наподобе EnumWindows для окон.]]></description>
        <author>dimon-max</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      </channel>
      </rss>
	