DWORD
queryObj(
LPVOID
lpParam)
{
return
NtQueryObject(hCopy, 1, pObject, MAX_PATH * 2, NULL);
}
void
getFileName(string& fileName)
{
pObject = (POBJECT_NAME_INFORMATION)HeapAlloc(GetProcessHeap(), 0, MAX_PATH * 2);
if
(pObject == 0)
{
HeapFree(GetProcessHeap(), 0, pObject);
return
;
}
HANDLE
hThread = CreateThread(NULL, 0, queryObj, NULL, 0, NULL);
if
(hThread == 0)
{
HeapFree(GetProcessHeap(), 0, pObject);
return
;
}
DWORD
dwSatus = WaitForSingleObject(hThread, 200);
if
(dwSatus == WAIT_TIMEOUT)
{
HeapFree(GetProcessHeap(), 0, pObject);
return
;
}
if
(pObject->NameBuffer != NULL)
{
DWORD
n = WideCharToMultiByte(CP_OEMCP, NULL, pObject->NameBuffer, -1, NULL, 0, NULL, FALSE);
char
* name =
new
char
[n + 1];
memset
(name, 0, n + 1);
WideCharToMultiByte(CP_OEMCP, NULL, pObject->NameBuffer, -1, name, n, NULL, FALSE);
fileName = name;
delete
[] name;
HeapFree(GetProcessHeap(), 0, pObject);
return
;
}
HeapFree(GetProcessHeap(), 0, pObject);
return
;
}
bool
init()
{
HMODULE
hNtDll = LoadLibrary(L
"ntdll.dll"
);
if
(hNtDll == NULL)
{
return
false
;
}
NTQUERYSYSTEMINFOMATION NtQuerySystemInformation = (NTQUERYSYSTEMINFOMATION)GetProcAddress(hNtDll,
"NtQuerySystemInformation"
);
if
(NtQuerySystemInformation == NULL)
{
return
false
;
}
nulFileHandle = CreateFile(L
"NUL"
, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
if
(nulFileHandle == NULL)
{
return
false
;
}
NtQueryObject = (PNtQueryObject)GetProcAddress(hNtDll,
"NtQueryObject"
);
DWORD
nSize = 4096;
pHandleInfo = (PSYSTEM_HANDLE_INFORMATION)HeapAlloc(GetProcessHeap(), 0, nSize);
while
(NtQuerySystemInformation(SystemHandleInformation, pHandleInfo, nSize, NULL) == STATUS_INFO_LENGTH_MISMATCH)
{
HeapFree(GetProcessHeap(), 0, pHandleInfo);
nSize += 4096;
pHandleInfo = (PSYSTEM_HANDLE_INFORMATION)HeapAlloc(GetProcessHeap(), 0, nSize);
}
if
(pHandleInfo == NULL)
{
return
false
;
}
return
true
;
}
int
getFileObjectTypeNumber()
{
for
(
ULONG
i = 0; i < pHandleInfo->NumberOfHandles; i++)
{
PSYSTEM_HANDLE pHandle = (PSYSTEM_HANDLE) & (pHandleInfo->HandleInfo[i]);
if
((
int
)GetCurrentProcessId() == pHandle->ProcessId && pHandle->Handle == (
USHORT
)nulFileHandle)
{
return
(
int
)pHandle->ObjectTypeNumber;
}
}
return
40;
}
void
closeFile(string& closeFileName)
{
int
fileObjectTypeNumber = getFileObjectTypeNumber();
for
(
ULONG
i = 0; i < pHandleInfo->NumberOfHandles; i++)
{
PSYSTEM_HANDLE pHandle = (PSYSTEM_HANDLE) & (pHandleInfo->HandleInfo[i]);
if
(pHandle->ObjectTypeNumber != fileObjectTypeNumber || pHandle->ProcessId == 4 || pHandle->Handle == 0)
{
continue
;
}
HANDLE
hProcess = OpenProcess(PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pHandle->ProcessId);
if
(hProcess == NULL)
{
continue
;
}
hCopy = 0;
if
(!DuplicateHandle(hProcess, (
HANDLE
)pHandle->Handle, GetCurrentProcess(), &hCopy, MAXIMUM_ALLOWED, FALSE, 0))
{
continue
;
}
int
pid = pHandle->ProcessId;
string fileName;
getFileName(fileName);
if
(fileName.find(closeFileName) != -1)
{
WCHAR
tmpName[MAX_PATH] = {};
DWORD
size = MAX_PATH;
QueryFullProcessImageName(hProcess, 0, tmpName, &size);
wStringToString(processName, tmpName);
HANDLE
h_tar = NULL;
if
(DuplicateHandle(hProcess, (
HANDLE
)pHandle->Handle, GetCurrentProcess(), &h_tar, 0, FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
{
CloseHandle(h_tar);
}
CloseHandle(hCopy);
CloseHandle(hProcess);
return
;
}
CloseHandle(hCopy);
CloseHandle(hProcess);
}
HeapFree(GetProcessHeap(), 0, pHandleInfo);
return
;
}