Okay, so it's a bit kludgy : enumhandles lists all open handles in current process (ie. enumhandles.exe) enumhandles xx lists all open handles in process xx (decimal) ---------------------------------------------------------------------------- eh.c #include #include WCHAR *GetNameFromHandle(HANDLE h); // eh2.c WCHAR *GetPipeFromHandle(HANDLE h); // eh2.c void EnumLocalHandles(); // eh.c void EnumRemoteHandles(HANDLE process); // eh.c void main(int argc, char *argv[]) { DWORD pid; HANDLE OtherProcess; if(argc==1) { printf("\n\nHandles for current process\n"); printf("===========================\n"); EnumLocalHandles(); } else { pid=atol(argv[1]); OtherProcess=OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid); if(OtherProcess==NULL) { printf("Can't open process %lu\n",pid); return; } printf("\n\nHandles for process %4lu\n",pid); printf("===========================\n"); EnumRemoteHandles(OtherProcess); CloseHandle(OtherProcess); } printf("\n\n"); } /* EnumLocalHandles lists all the handles for the current process. Because this is quite boring, we open a file and a pipe first. */ void EnumLocalHandles() { /* Make something to look at */ HANDLE h,p; DWORD i; DWORD htype; h=CreateFile("E:\\MSDEV\\projects\\findmailslot\\enumhandle\\Debug\\eh2.obj", GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); p=CreateNamedPipe("\\\\.\\pipe\\MyPipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE, PIPE_UNLIMITED_INSTANCES, 4096, 4096,1000,NULL); for(i=0;i<0x400;i+=4) // Nasty hacky loop { htype=GetFileType((HANDLE)i); switch(htype) { case FILE_TYPE_UNKNOWN: break; case FILE_TYPE_DISK: printf("%03lx disk %ls\n",i,GetNameFromHandle((HANDLE)i)); break; case FILE_TYPE_CHAR: printf("%03lx char\n",i); break; case FILE_TYPE_PIPE: printf("%03lx pipe %ls\n",i,GetNameFromHandle((HANDLE)i)); break; } } CloseHandle(h); CloseHandle(p); } void EnumRemoteHandles(HANDLE process) { HANDLE duplicate; DWORD htype,i; for(i=0;i<0x400;i+=4) { /* Make a copy of their handle in our handle table. */ if(DuplicateHandle(process, (HANDLE)i, GetCurrentProcess(), &duplicate, 0, FALSE, DUPLICATE_SAME_ACCESS)) { htype=GetFileType(duplicate); switch(htype) { case FILE_TYPE_UNKNOWN: break; case FILE_TYPE_DISK: printf("%03lx disk %ls\n",i,GetNameFromHandle(duplicate)); break; case FILE_TYPE_CHAR: printf("%03lx char %ls\n",i,GetNameFromHandle(duplicate)); break; case FILE_TYPE_PIPE: printf("%03lx pipe %ls\n",i,GetNameFromHandle(duplicate)); break; } // switch CloseHandle(duplicate); } // if } // for } ---------------------------------------------------------------------------- eh2.c #define _X86_ #include // and link with ntdll.lib #include #include WCHAR *GetNameFromHandle(HANDLE h) { char buffer[4096]; IO_STATUS_BLOCK IoStatusBlock; NTSTATUS status; memset(buffer,0,4096); status=ZwQueryInformationFile(h, &IoStatusBlock, buffer, 4096, FileNameInformation); /* Returns { DWORD length; WCHAR name[]; } */ return((WCHAR*)(buffer+4)); } ---------------------------------------------------------------------------- Last updated 1st September '96 Personal jon@brilig.demon.co.uk Work jedwards@drsolomon.com