121 lines
2.4 KiB
C++
121 lines
2.4 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1994 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
handle.cxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Contains function to return number of open handles owned by this process
|
|||
|
|
|||
|
Contents:
|
|||
|
InternetHandleCount
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Richard L Firth (rfirth) 02-May-1995
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Win32 user-mode DLL
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
02-May-1995 rfirth
|
|||
|
Created
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include <wininetp.h>
|
|||
|
#include "rprintf.h"
|
|||
|
|
|||
|
#if INET_DEBUG
|
|||
|
|
|||
|
//
|
|||
|
// private types
|
|||
|
//
|
|||
|
|
|||
|
typedef (*NT_QUERY_SYSTEM_INFORMATION)(ULONG, PVOID, ULONG, PULONG);
|
|||
|
|
|||
|
//
|
|||
|
// functions
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
DWORD
|
|||
|
InternetHandleCount(
|
|||
|
VOID
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Gets the number of system handles owned by this process. We LoadLibrary()
|
|||
|
NTDLL.DLL so that the debug version of this DLL still works on Win95
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
DWORD
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static HINSTANCE hNtdll = NULL;
|
|||
|
static NT_QUERY_SYSTEM_INFORMATION _NtQuerySystemInformation;
|
|||
|
|
|||
|
if (IsPlatformWin95()) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
if (hNtdll == NULL) {
|
|||
|
hNtdll = LoadLibrary("ntdll");
|
|||
|
if (hNtdll == NULL) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
_NtQuerySystemInformation = (NT_QUERY_SYSTEM_INFORMATION)GetProcAddress(hNtdll, "NtQuerySystemInformation");
|
|||
|
if (_NtQuerySystemInformation == 0) {
|
|||
|
FreeLibrary(hNtdll);
|
|||
|
hNtdll = NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (_NtQuerySystemInformation) {
|
|||
|
|
|||
|
DWORD idProcess;
|
|||
|
NTSTATUS status;
|
|||
|
ULONG outputLength;
|
|||
|
BYTE buffer[32768];
|
|||
|
PSYSTEM_PROCESS_INFORMATION info;
|
|||
|
|
|||
|
status = _NtQuerySystemInformation(SystemProcessInformation,
|
|||
|
(PVOID)buffer,
|
|||
|
sizeof(buffer),
|
|||
|
&outputLength
|
|||
|
);
|
|||
|
if (!NT_SUCCESS(status)) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
info = (PSYSTEM_PROCESS_INFORMATION)buffer;
|
|||
|
idProcess = GetCurrentProcessId();
|
|||
|
while (TRUE) {
|
|||
|
if ((DWORD_PTR)info->UniqueProcessId == idProcess) {
|
|||
|
return info->HandleCount;
|
|||
|
}
|
|||
|
if (info->NextEntryOffset == 0) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
info = (PSYSTEM_PROCESS_INFORMATION)((PCHAR)info + info->NextEntryOffset);
|
|||
|
}
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
#endif // INET_DEBUG
|