www.pudn.com > openfiles.zip > openfiles.cpp
// OpenFiles.cpp (Windows 95/98 Only!) // // This example will show you how you can retrieve the information // about what files are currently open on your Windows 95/98 system. // The information includes the path, the way the file has been opened // and the access and share modes. // // (c)1999 Ashot Oganesyan K, SmartLine, Inc // mailto:ashot@aha.ru, http://www.protect-me.com, http://www.codepile.com #include#include typedef struct _DIOC_REGISTERS { DWORD reg_EBX; DWORD reg_EDX; DWORD reg_ECX; DWORD reg_EAX; DWORD reg_EDI; DWORD reg_ESI; DWORD reg_Flags; } DIOC_REGISTERS, *PDIOC_REGISTERS; #if !defined VWIN32_DIOC_DOS_IOCTL #define VWIN32_DIOC_DOS_IOCTL 0x0001 #endif // Intel x86 processor status flags #define CARRY_FLAG 0x0001 // Access modes #define OPEN_ACCESS_READONLY 0x0000 #define OPEN_ACCESS_WRITEONLY 0x0001 #define OPEN_ACCESS_READWRITE 0x0002 #define OPEN_ACCESS_RO_NOMODLASTACCESS 0x0004 // Share modes #define OPEN_SHARE_COMPATIBLE 0x0000 #define OPEN_SHARE_DENYREADWRITE 0x0010 #define OPEN_SHARE_DENYWRITE 0x0020 #define OPEN_SHARE_DENYREAD 0x0030 #define OPEN_SHARE_DENYNONE 0x0040 // Open flags #define OPEN_FLAGS_NOINHERIT 0x0080 #define OPEN_FLAGS_NO_BUFFERING 0x0100 #define OPEN_FLAGS_NO_COMPRESS 0x0200 #define OPEN_FLAGS_ALIAS_HINT 0x0400 #define OPEN_FLAGS_NOCRITERR 0x2000 #define OPEN_FLAGS_COMMIT 0x4000 // File types #define FILENORMAL 0x0000 #define MEMORYMAPPED 0x0001 #define DLLOREXECUTABLE 0x0002 #define SWAPFILE 0x0004 // Opens a handle to VWIN32 that can be used to issue low-level commands HANDLE WINAPI OpenVWin32 (void); // Closes the handle opened by OpenVWin32 BOOL WINAPI CloseVWin32 (HANDLE hVWin32); void main(void) { HANDLE hVWin32 = OpenVWin32(); if (hVWin32 == INVALID_HANDLE_VALUE) return; DWORD Dev = GetLogicalDrives(); DIOC_REGISTERS regs; int i; char buf[MAX_PATH]; BOOL fResult; DWORD cb; for (register int k=0; k<26; ++k) { if (Dev & 0x01) { i=0; while (TRUE) { ZeroMemory(®s,sizeof(regs)); regs.reg_EBX = k+1; // Drive ID (0-Default drive,A-1,B-2,C-3,...) regs.reg_EDX = (DWORD)buf; // File name regs.reg_ECX = 0x486D; // Enumerate Open Files regs.reg_EAX = 0x440D; // IOCTL for block devices regs.reg_EDI = 0x0000; // 0-enum all,1-unmovable files only regs.reg_ESI = i++; // Zero-based file ID fResult = DeviceIoControl (hVWin32, VWIN32_DIOC_DOS_IOCTL, ®s, sizeof(regs), ®s, sizeof(regs), &cb, 0); if (!fResult || regs.reg_Flags & CARRY_FLAG) break; printf("%s\t",buf); switch(LOWORD(regs.reg_ECX)) { case FILENORMAL: printf("Normal\t"); break; case MEMORYMAPPED: printf("Memory Mapped\t"); break; case DLLOREXECUTABLE: printf("DLL or Executable\t"); break; case SWAPFILE: printf("Swap File\t"); break; default: printf("Unknown\t"); break; } if (LOWORD(regs.reg_EAX) & OPEN_ACCESS_RO_NOMODLASTACCESS) printf("NOMODALASTACCESS\t"); else if (LOWORD(regs.reg_EAX) & OPEN_ACCESS_READWRITE) printf("READWRITE\t"); else if (LOWORD(regs.reg_EAX) & OPEN_ACCESS_WRITEONLY) printf("WRITEONLY\t"); else printf("READONLY\t"); if (LOWORD(regs.reg_EAX) & OPEN_SHARE_DENYNONE) printf("DENYNONE\t"); else if (LOWORD(regs.reg_EAX) & OPEN_SHARE_DENYWRITE) printf("DENYWRITE\t"); else if (LOWORD(regs.reg_EAX) & OPEN_SHARE_DENYREAD) printf("DENYREAD\t"); else if (LOWORD(regs.reg_EAX) & OPEN_SHARE_DENYREADWRITE) printf("DENYREADWRITE\t"); else printf("COMPATIBLE\t"); if (LOWORD(regs.reg_EAX) & OPEN_FLAGS_COMMIT) printf("COMMIT\n"); else if (LOWORD(regs.reg_EAX) & OPEN_FLAGS_NOCRITERR) printf("NOCRITERR\n"); else if (LOWORD(regs.reg_EAX) & OPEN_FLAGS_ALIAS_HINT) printf("ALIASHINT\n"); else if (LOWORD(regs.reg_EAX) & OPEN_FLAGS_NO_COMPRESS) printf("NOCOMPRESS\n"); else if (LOWORD(regs.reg_EAX) & OPEN_FLAGS_NO_BUFFERING) printf("NOBUFFER\n"); else if (LOWORD(regs.reg_EAX) & OPEN_FLAGS_NOINHERIT) printf("NOINHERIT\n"); else printf("\n"); } } Dev = Dev >> 1; } CloseVWin32(hVWin32); } HANDLE WINAPI OpenVWin32 (void) { return CreateFile (TEXT("\\\\.\\vwin32"), 0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL); } BOOL WINAPI CloseVWin32 (HANDLE hVWin32) { return CloseHandle (hVWin32); }