[Issue 1695] New: Calling some functions out of PSAPI.dll corrupts stack
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Nov 27 22:19:13 PST 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1695
Summary: Calling some functions out of PSAPI.dll corrupts stack
Product: D
Version: 2.007
Platform: PC
OS/Version: Windows
Status: NEW
Severity: critical
Priority: P2
Component: DMD
AssignedTo: bugzilla at digitalmars.com
ReportedBy: mail at tobias-wassermann.de
1. Generate a lib with implib: implib /noi /system psapi.lib
C:\windows\system32\psapi.lib
2. Compile the following code with dmd ProcessFinder.d -L+psapi/noi
import std.stdio;
import std.c.windows.windows;
extern (Windows) HANDLE OpenProcess(uint dwDesiredAccess, BOOL bInheritHandle,
uint dwProcessId);
extern (C)
{
BOOL EnumProcesses(DWORD* pProcessIds, DWORD cb, DWORD* pBytesReturned);
DWORD GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule, char* fileName,
uint size);
DWORD GetProcessImageFileNameA(HANDLE hProcess, LPSTR lpImageFileName, DWORD
nSize);
}
void main(char[][] args)
{
uint[256] processIds;
uint byteCount;
char[] processFileName;
int ret = EnumProcesses(processIds.ptr, processIds.length*uint.sizeof,
&byteCount);
if(ret!=0)
{
for(uint i=0; i<processIds.length && i<byteCount/uint.sizeof; i++)
{
if(processIds[i]==0)
continue;
uint pid = processIds[i];
writefln("Process #%d - PID: %d", i, pid);
HANDLE hProcess = OpenProcess(0x410 /* QueryInformation | VMRead */,
false, pid);
if(cast(int)hProcess>0)
{
processFileName.length = 300;
uint namelength = 0;
//namelength = GetProcessImageFileNameA(hProcess, processFileName.ptr,
processFileName.length);
namelength = GetModuleFileNameExA(hProcess, cast(HMODULE)0,
processFileName.ptr, processFileName.length);
processFileName.length = namelength;
writefln("=> %s", processFileName);
CloseHandle(hProcess);
}
}
}
}
So what will happen? With commented out GetModuleFileNameExA()-call you will
get a list of correct process id's:
Process #1 - PID: 4
Process #2 - PID: 780
Process #3 - PID: 836
If you use GetModuleFileNameExA() the list will be incorrect:
Process #1 - PID: 4
Process #2 - PID: 780
Process #3 - PID: 836
Process #4 - PID: 4298544
Process #6 - PID: 1244976
Process #7 - PID: 4202711
Process #8 - PID: 1040
Process #9 - PID: 1288
Process #10 - PID: 1332
Process #4 to Process #8: These are invalid process id's - processes with these
id doesn't exist, the next real id is 1288.
3. After calling GetModuleFileNameExA() the stack will be corrupted, the
processIds-Array will be incorrect, if you comment out this call, all works
fine. The same behaviour if you call GetProcessImageFileNameA()
Strange thing: If you port the code to C and compile against DMC - same
problem! If you compile it with Microsoft Visual C++, you can also use
GetModuleFileNameExA() and GetProcessImageFileNameA() without any problems.
Seems to be an implib-issue?
See also the "Windows API: Strange behaviour after calling
GetModuleFileNameExA" entries within the digitalmars.D-newsgroup
--
More information about the Digitalmars-d-bugs
mailing list