дублирование хэндлов
От: Аноним  
Дата: 25.01.09 18:01
Оценка:
привет парни!
у меня ко всем ВАМ такой вопрос... есть следующий код:

Button1:

CComBSTR sDrive = "\\\\.\\";
UpdateData();
UpdateData(FALSE);
sDrive.Append(m_drive.AllocSysString());
m_driveHandle = CreateFileW(sDrive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

// здесь sDrive у меня sDrive \\.\Е:

возвращается нормальный хэндл m_driveHandle, но параллельно всему этому создаётся ещё один хэндл!!!

потом я пишу на Button2:
if((m_driveHandle != INVALID_HANDLE_VALUE) && (m_driveHandle != NULL))
{
BOOL res = CloseHandle(m_driveHandle);
m_driveHandle = NULL;
}

хэндл закрывается, но второй так и висит!!!..(( как это пофиксить?????
Re: дублирование хэндлов
От: Аноним  
Дата: 25.01.09 18:13
Оценка:
Возможно этот глюк Винды...
Re: дублирование хэндлов
От: x64 Россия  
Дата: 25.01.09 22:00
Оценка: 1 (1) +1 :)
А>возвращается нормальный хэндл m_driveHandle, но параллельно всему этому создаётся ещё один хэндл!!!

Во-первых, откуда вам это известно? Во-вторых, если уж вам известно что создаётся какой-то хендл, вероятно у вас есть и какая-то информация об этом хендле (тип, имя объекта, ...)?
Re[2]: дублирование хэндлов
От: Аноним  
Дата: 27.01.09 15:23
Оценка:
Здравствуйте, x64, Вы писали:

А>>возвращается нормальный хэндл m_driveHandle, но параллельно всему этому создаётся ещё один хэндл!!!


x64>Во-первых, откуда вам это известно? Во-вторых, если уж вам известно что создаётся какой-то хендл, вероятно у вас есть и какая-то информация об этом хендле (тип, имя объекта, ...)?


Это я вижу в Task Manager, создаётся два хэндла, а закрывается только один...

про известный мне хэндл я знаю его значение, object address, access. Про второй же я не имею информации.
Да, чуть не забыл про очень важную деталь, моя проблема воспроизводится, если в приводе нет диска! Если диск есть, то всё Ок.
Re[3]: дублирование хэндлов
От: Аноним  
Дата: 27.01.09 15:30
Оценка: +1
А>>>возвращается нормальный хэндл m_driveHandle, но параллельно всему этому создаётся ещё один хэндл!!!
x64>>Во-первых, откуда вам это известно? Во-вторых, если уж вам известно что создаётся какой-то хендл, вероятно у вас есть и какая-то информация об этом хендле (тип, имя объекта, ...)?

А>Это я вижу в Task Manager, создаётся два хэндла, а закрывается только один...

А>про известный мне хэндл я знаю его значение, object address, access. Про второй же я не имею информации.
А>Да, чуть не забыл про очень важную деталь, моя проблема воспроизводится, если в приводе нет диска! Если диск есть, то всё Ок.

Смиритесь с этим. В вашем процессе работает не только ваш код, потому контролировать все ресурсы вы не можете.
Re[4]: дублирование хэндлов
От: Аноним  
Дата: 27.01.09 16:08
Оценка:
Т.е. это исправить никак нельзя?
Re[5]: дублирование хэндлов
От: Аноним  
Дата: 27.01.09 16:16
Оценка:
А>Т.е. это исправить никак нельзя?
Это приводит к каким либо проблемам в работе программы, в том числе если эта операция будет выполнена много раз?
Re[3]: дублирование хэндлов
От: x64 Россия  
Дата: 27.01.09 16:17
Оценка:
А>Это я вижу в Task Manager, создаётся два хэндла, а закрывается только один...
А>про известный мне хэндл я знаю его значение, object address, access. Про второй же я не имею информации.

Значит так, предположений сейчас можно массу сделать, и про файловые фильтры (и не только файловые), и про user-mode перехватчики какие-нибудь. Чтобы не гадать, делаем следующее:

1. Запускаем Process Explorer (скачать можно отсюда).
2. Запускаем нашу программу и производим в ней действия, чтобы получить второй хендл, описанные выше.
3. Выбираем в Process Explorer'е нужный процесс (наш процесс).
4. Меню View -> Show lower pane.
5. Меню View -> Lower pane view -> Handles.
6. В нижней панели копируем информацию обо всех хендлах и пишем сюда в ответ на это сообщение.
7. Меню View -> Lower pane view -> DLLs.
8. В нижней панели копируем информацию обо всех загруженных DLL и пишем сюда в ответ на это сообщение.

Вперёд, тогда можно будет что-нибудь более интересное сказать. Хотя в итоге я согласен с анонимным оратором — любой чужой код (возможно, содержащий ошибки), загруженный в твой процесс, контролировать невозможно и не нужно. Это проблема пользователя, пусть он решает, — стоит ли использовать такой код или нет (хотя, конечно, иногда трудно доказывать, что не верблюд, это да...).
Re[6]: дублирование хэндлов
От: Аноним  
Дата: 27.01.09 16:20
Оценка:
в принципе, мой запрос к приводу производится много раз, и от этого клонирования очень хотелось бы избавиться...
Re[7]: дублирование хэндлов
От: Аноним  
Дата: 27.01.09 16:34
Оценка:
А>в принципе, мой запрос к приводу производится много раз, и от этого клонирования очень хотелось бы избавиться...
И каждый раз отжирается доп хэндл?
Re[4]: дублирование хэндлов
От: Аноним  
Дата: 27.01.09 16:35
Оценка:
Process PID
System Idle Process 0
Interrupts n/a
DPCs n/a
System 4
smss.exe 1208
csrss.exe 1268
winlogon.exe 1292
services.exe 1336
svchost.exe 1536
CapabilityManager.exe 944
Generic.exe 3852
epmworker.exe 1564
NMIndexStoreSvr.exe 2792
dexplore.exe 2708
svchost.exe 1620
svchost.exe 1732
svchost.exe 1772
svchost.exe 1812
spoolsv.exe 1880
avp.exe 240
klnagent.exe 312
sqlservr.exe 368
NBService.exe 388
nvsvc32.exe 916
svchost.exe 1192
VC6SecS.exe 1388
alg.exe 2500
NMIndexingService.exe 2928
lsass.exe 1348
explorer.exe 2512
procexp.exe 4068
RTHDCPL.exe 1572
TSVNCache.exe 1752
rundll32.exe 1396
avp.exe 568
winampa.exe 644
jusched.exe 716
jucheck.exe 3944
CrypticDisk.exe 808
Application Launcher.exe 536
PWRISOVM.EXE 836
VC6Play.exe 952
vc6tray.exe 3268
ctfmon.exe 128
msmsgs.exe 1004
daemon.exe 2088
yupdate.exe 2208
Totalcmd.exe 3720
qip.exe 4040
devenv.exe 3228
mspdbsrv.exe 1436
TestCDHandlers.exe 1928
opera.exe 964

Process: TestCDHandlers.exe Pid: 1928

Type Name Handle Object Address Share Flags Access
Desktop \Default 0xFDC 0x8A708EE0 0x000F01FF
Directory \Sessions\0\DosDevices\00000000-00016206 0xF54 0xE3401F58 0x00000001 // здесь незакрываемые хэндлы!!
Directory \Sessions\0\DosDevices\00000000-00016206 0xF58 0xE3401F58 0x00000001 //
Directory \Sessions\0\DosDevices\00000000-00016206 0xF5C 0xE3401F58 0x00000001 //
Directory \Sessions\0\DosDevices\00000000-00016206 0xF60 0xE3401F58 0x00000001 //
Directory \BaseNamedObjects 0xFCC 0xE1E73418 0x0002000F
Directory \Windows 0xFF0 0xE20387A8 0x000F000F
Directory \KnownDlls 0xFF8 0xE26405D0 0x00000003
Event \BaseNamedObjects\mixercallback 0xB4C 0x8AA1C430 0x00100002
Event \BaseNamedObjects\hardwaremixercallback 0xB50 0x8AAF9570 0x00100002
Event 0xFE8 0x893AD610 0x001F0003
File D:\Work\TestCDHandlers 0xC 0x89550768 RW- 0x00100020
File \Device\CdRom0 0xF70 0x8A79B8E8 R-- 0x0012019F // закрываемый хэндл
File \Device\KsecDD 0xFB4 0x89F2D028 0x00100001
File C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFCLOC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_91481303 0xFBC 0x899F9F90 RW- 0x00100020
File C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c 0xFE4 0x8939A2C8 RW- 0x00100020
File C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugMFC_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_c8452471 0xFF4 0x893B56A8 RW- 0x00100020
Key HKLM\SYSTEM\ControlSet002\Control\Nls\Language Groups 0xF7C 0xE46EE518 0x00020019
Key HKLM\SYSTEM\ControlSet002\Control\Nls\Locale\Alternate Sorts 0xF80 0xE3F281F8 0x00020019
Key HKLM\SYSTEM\ControlSet002\Control\Nls\Locale 0xF84 0xE1375360 0x00020019
Key HKCU 0xFB0 0xE1E3D0A8 0x000F003F
Key HKLM 0xFC8 0xE39E0988 0x000F003F
KeyedEvent \KernelObjects\CritSecOutOfMemoryEvent 0xFFC 0xE1009598 0x000F0003
Mutant \BaseNamedObjects\DBWinMutex 0x24C 0x8A96C728 0x00120001
Mutant \BaseNamedObjects\MSCTF.Shared.MUTEX.ABJ 0xF68 0x893C55D0 0x001F0001
Mutant \BaseNamedObjects\MSCTF.Shared.MUTEX.IHH 0xF74 0x8A6B9570 0x001F0001
Mutant \BaseNamedObjects\ShimCacheMutex 0xF8C 0x8A6C2810 0x00120001
Mutant \BaseNamedObjects\CTF.TimListCache.FMPDefaultS-1-5-21-3300419232-83257045-1333047867-1515MUTEX.DefaultS-1-5-21-3300419232-83257045-1333047867-1515 0xF94 0x89DD0258 0x001F0001
Mutant \BaseNamedObjects\CTF.TMD.MutexDefaultS-1-5-21-3300419232-83257045-1333047867-1515 0xF98 0x8A77F6C8 0x001F0001
Mutant \BaseNamedObjects\CTF.Layouts.MutexDefaultS-1-5-21-3300419232-83257045-1333047867-1515 0xF9C 0x8A77F718 0x001F0001
Mutant \BaseNamedObjects\CTF.Asm.MutexDefaultS-1-5-21-3300419232-83257045-1333047867-1515 0xFA0 0x89D74BF8 0x001F0001
Mutant \BaseNamedObjects\CTF.Compart.MutexDefaultS-1-5-21-3300419232-83257045-1333047867-1515 0xFA4 0x89D74C48 0x001F0001
Mutant \BaseNamedObjects\CTF.LBES.MutexDefaultS-1-5-21-3300419232-83257045-1333047867-1515 0xFA8 0x89D22BF8 0x001F0001
Port 0xFEC 0xE447F430 0x001F0001
Section \BaseNamedObjects\MSCTF.Shared.SFM.ABJ 0xF64 0xE13C3390 0x000F0007
Section \BaseNamedObjects\MSCTF.Shared.SFM.IHH 0xF6C 0xE3D14738 0x000F001F
Section \BaseNamedObjects\ShimSharedMemory 0xF88 0xE2BC1460 0x00000002
Section \BaseNamedObjects\CTF.TimListCache.FMPDefaultS-1-5-21-3300419232-83257045-1333047867-1515SFM.DefaultS-1-5-21-3300419232-83257045-1333047867-1515 0xF90 0xE3605258 0x000F001F
Section \BaseNamedObjects\CiceroSharedMemDefaultS-1-5-21-3300419232-83257045-1333047867-1515 0xFAC 0xE2B99168 0x000F0007
Section \BaseNamedObjects\AtlDebugAllocator_FileMappingNameStatic3_788 0xFB8 0xE3C18C08 0x000F0007
Section \BaseNamedObjects\AtlDebugAllocator_FileMappingNameStatic3_788 0xFC0 0xE3C18C08 0x000F0007
Semaphore \BaseNamedObjects\shell.{A48F1A32-A340-11D1-BC6B-00A0C90312E1} 0xFC4 0x8A6EEFC0 0x001F0003
Semaphore 0xFD0 0x8AA9ABE8 0x00100003
Semaphore 0xFD4 0x89D51A48 0x00100003
WindowStation \Windows\WindowStations\WinSta0 0xFD8 0x8A464738 0x000F037F
WindowStation \Windows\WindowStations\WinSta0 0xFE0 0x8A464738 0x000F037F
Re[8]: дублирование хэндлов
От: Demon103  
Дата: 27.01.09 16:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>в принципе, мой запрос к приводу производится много раз, и от этого клонирования очень хотелось бы избавиться...

А>И каждый раз отжирается доп хэндл?

Да!!! при каждой последующей итерации +1
Re[4]: дублирование хэндлов
От: Demon103  
Дата: 27.01.09 16:48
Оценка:
На счёт dll всё пусто...
Re[5]: дублирование хэндлов
От: x64 Россия  
Дата: 27.01.09 23:22
Оценка:
D>На счёт dll всё пусто...

Что пусто? Список DLL пуст? Хм, вероятно в твоей системе живёт святой дух, поддерживающий жизнь в приглянувшихся ему процессах, нет?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.