Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlain Magloire2003-04-30 18:07:43 +0000
committerAlain Magloire2003-04-30 18:07:43 +0000
commit411b66d335aee39efb3bcf546a477475d37d85b1 (patch)
tree1ec24cbe96607977d46ca83644094950d2f1b7f0 /core/org.eclipse.cdt.core.win32
parent7c38a9e9c91de5bd550a163c609e2ccc08525514 (diff)
downloadorg.eclipse.cdt-411b66d335aee39efb3bcf546a477475d37d85b1.tar.gz
org.eclipse.cdt-411b66d335aee39efb3bcf546a477475d37d85b1.tar.xz
org.eclipse.cdt-411b66d335aee39efb3bcf546a477475d37d85b1.zip
New code to implement attaching
Diffstat (limited to 'core/org.eclipse.cdt.core.win32')
-rw-r--r--core/org.eclipse.cdt.core.win32/library/listtasks/StdAfx.cpp8
-rw-r--r--core/org.eclipse.cdt.core.win32/library/listtasks/StdAfx.h19
-rw-r--r--core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.cpp313
-rw-r--r--core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.dsp117
-rw-r--r--core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.dsw29
-rw-r--r--core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.h12
6 files changed, 498 insertions, 0 deletions
diff --git a/core/org.eclipse.cdt.core.win32/library/listtasks/StdAfx.cpp b/core/org.eclipse.cdt.core.win32/library/listtasks/StdAfx.cpp
new file mode 100644
index 00000000000..1dde80a9f18
--- /dev/null
+++ b/core/org.eclipse.cdt.core.win32/library/listtasks/StdAfx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// ProcList.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/core/org.eclipse.cdt.core.win32/library/listtasks/StdAfx.h b/core/org.eclipse.cdt.core.win32/library/listtasks/StdAfx.h
new file mode 100644
index 00000000000..e7e62d722f3
--- /dev/null
+++ b/core/org.eclipse.cdt.core.win32/library/listtasks/StdAfx.h
@@ -0,0 +1,19 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#if !defined(AFX_STDAFX_H__CB3B970F_AA1A_4B59_9F98_DDBEA28470AF__INCLUDED_)
+#define AFX_STDAFX_H__CB3B970F_AA1A_4B59_9F98_DDBEA28470AF__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+
+// TODO: reference additional headers your program requires here
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_STDAFX_H__CB3B970F_AA1A_4B59_9F98_DDBEA28470AF__INCLUDED_)
diff --git a/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.cpp b/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.cpp
new file mode 100644
index 00000000000..be632e5547e
--- /dev/null
+++ b/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.cpp
@@ -0,0 +1,313 @@
+// ProcList.cpp : Defines the entry point for the console application.
+//
+
+#include "stdafx.h"
+
+#include "listtasks.h"
+#include <tlhelp32.h>
+#include <vdmdbg.h>
+#include <iostream>
+#include <iomanip>
+
+using namespace std;
+
+typedef struct
+{
+ DWORD dwPID ;
+ PROCENUMPROC lpProc ;
+ DWORD lParam ;
+ BOOL bEnd ;
+} EnumInfoStruct ;
+
+BOOL WINAPI Enum16( DWORD dwThreadId, WORD hMod16, WORD hTask16,
+ PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined ) ;
+
+BOOL CALLBACK OutProcInfo( DWORD pid, WORD, LPSTR procName, LPARAM ) ;
+
+int main(int argc, char* argv[])
+{
+ EnumProcs(OutProcInfo, 0);
+ return 0;
+}
+
+
+
+/*********************
+EnumProc.cpp
+*********************/
+
+// The EnumProcs function takes a pointer to a callback function
+// that will be called once per process in the system providing
+// process EXE filename and process ID.
+// Callback function definition:
+// BOOL CALLBACK Proc( DWORD dw, LPCSTR lpstr, LPARAM lParam ) ;
+//
+// lpProc -- Address of callback routine.
+//
+// lParam -- A user-defined LPARAM value to be passed to
+// the callback routine.
+BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam )
+{
+ OSVERSIONINFO osver ;
+ HINSTANCE hInstLib ;
+ HINSTANCE hInstLib2 ;
+ HANDLE hSnapShot ;
+ PROCESSENTRY32 procentry ;
+ BOOL bFlag ;
+ LPDWORD lpdwPIDs ;
+ DWORD dwSize, dwSize2, dwIndex ;
+ HMODULE hMod ;
+ HANDLE hProcess ;
+ char szFileName[ MAX_PATH ] ;
+ EnumInfoStruct sInfo ;
+
+ // ToolHelp Function Pointers.
+ HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD) ;
+ BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32) ;
+ BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32) ;
+
+ // PSAPI Function Pointers.
+ BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );
+ BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *,
+ DWORD, LPDWORD );
+ DWORD (WINAPI *lpfGetModuleFileNameEx)( HANDLE, HMODULE,
+ LPTSTR, DWORD );
+
+ // VDMDBG Function Pointers.
+ INT (WINAPI *lpfVDMEnumTaskWOWEx)( DWORD,
+ TASKENUMPROCEX fp, LPARAM );
+
+
+ // Check to see if were running under Windows95 or
+ // Windows NT.
+ osver.dwOSVersionInfoSize = sizeof( osver ) ;
+ if( !GetVersionEx( &osver ) )
+ {
+ return FALSE ;
+ }
+
+ // If Windows NT:
+ if( osver.dwPlatformId == VER_PLATFORM_WIN32_NT )
+ {
+
+ // Load library and get the procedures explicitly. We do
+ // this so that we don't have to worry about modules using
+ // this code failing to load under Windows 95, because
+ // it can't resolve references to the PSAPI.DLL.
+ hInstLib = LoadLibraryA( "PSAPI.DLL" ) ;
+ if( hInstLib == NULL )
+ return FALSE ;
+
+ hInstLib2 = LoadLibraryA( "VDMDBG.DLL" ) ;
+ if( hInstLib2 == NULL )
+ return FALSE ;
+
+ // Get procedure addresses.
+ lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))
+ GetProcAddress( hInstLib, "EnumProcesses" ) ;
+ lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *,
+ DWORD, LPDWORD)) GetProcAddress( hInstLib,
+ "EnumProcessModules" ) ;
+ lpfGetModuleFileNameEx =(DWORD (WINAPI *)(HANDLE, HMODULE,
+ LPTSTR, DWORD )) GetProcAddress( hInstLib,
+ "GetModuleFileNameExA" ) ;
+ lpfVDMEnumTaskWOWEx =(INT(WINAPI *)( DWORD, TASKENUMPROCEX,
+ LPARAM))GetProcAddress( hInstLib2, "VDMEnumTaskWOWEx" );
+ if( lpfEnumProcesses == NULL ||
+ lpfEnumProcessModules == NULL ||
+ lpfGetModuleFileNameEx == NULL ||
+ lpfVDMEnumTaskWOWEx == NULL)
+ {
+ FreeLibrary( hInstLib ) ;
+ FreeLibrary( hInstLib2 ) ;
+ return FALSE ;
+ }
+
+ // Call the PSAPI function EnumProcesses to get all of the
+ // ProcID's currently in the system.
+ // NOTE: In the documentation, the third parameter of
+ // EnumProcesses is named cbNeeded, which implies that you
+ // can call the function once to find out how much space to
+ // allocate for a buffer and again to fill the buffer.
+ // This is not the case. The cbNeeded parameter returns
+ // the number of PIDs returned, so if your buffer size is
+ // zero cbNeeded returns zero.
+ // NOTE: The "HeapAlloc" loop here ensures that we
+ // actually allocate a buffer large enough for all the
+ // PIDs in the system.
+ dwSize2 = 256 * sizeof( DWORD ) ;
+ lpdwPIDs = NULL ;
+ do
+ {
+ if( lpdwPIDs )
+ {
+ HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ;
+ dwSize2 *= 2 ;
+ }
+ lpdwPIDs = (LPDWORD)HeapAlloc( GetProcessHeap(), 0, dwSize2 );
+ if( lpdwPIDs == NULL )
+ {
+ FreeLibrary( hInstLib ) ;
+ FreeLibrary( hInstLib2 ) ;
+ return FALSE ;
+ }
+ if( !lpfEnumProcesses( lpdwPIDs, dwSize2, &dwSize ) )
+ {
+ HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ;
+ FreeLibrary( hInstLib ) ;
+ FreeLibrary( hInstLib2 ) ;
+ return FALSE ;
+ }
+ }while( dwSize == dwSize2 ) ;
+
+ // How many ProcID's did we get?
+ dwSize /= sizeof( DWORD ) ;
+
+ // Loop through each ProcID.
+ for( dwIndex = 0 ; dwIndex < dwSize ; dwIndex++ )
+ {
+ szFileName[0] = 0 ;
+ // Open the process (if we can... security does not
+ // permit every process in the system).
+ hProcess = OpenProcess(
+ PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
+ FALSE, lpdwPIDs[ dwIndex ] ) ;
+ if( hProcess != NULL )
+ {
+ // Here we call EnumProcessModules to get only the
+ // first module in the process this is important,
+ // because this will be the .EXE module for which we
+ // will retrieve the full path name in a second.
+ if( lpfEnumProcessModules( hProcess, &hMod,
+ sizeof( hMod ), &dwSize2 ) )
+ {
+ // Get Full pathname:
+ if( !lpfGetModuleFileNameEx( hProcess, hMod,
+ szFileName, sizeof( szFileName ) ) )
+ {
+ szFileName[0] = 0 ;
+ }
+ }
+ CloseHandle( hProcess ) ;
+ }
+ // Regardless of OpenProcess success or failure, we
+ // still call the enum func with the ProcID.
+ if(!lpProc( lpdwPIDs[dwIndex], 0, szFileName, lParam))
+ break ;
+
+ // Did we just bump into an NTVDM?
+ if( _stricmp( szFileName+(strlen(szFileName)-9),
+ "NTVDM.EXE")==0)
+ {
+ // Fill in some info for the 16-bit enum proc.
+ sInfo.dwPID = lpdwPIDs[dwIndex] ;
+ sInfo.lpProc = lpProc ;
+ sInfo.lParam = lParam ;
+ sInfo.bEnd = FALSE ;
+ // Enum the 16-bit stuff.
+ lpfVDMEnumTaskWOWEx( lpdwPIDs[dwIndex],
+ (TASKENUMPROCEX) Enum16,
+ (LPARAM) &sInfo);
+
+ // Did our main enum func say quit?
+ if(sInfo.bEnd)
+ break ;
+ }
+ }
+
+ HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ;
+ FreeLibrary( hInstLib2 ) ;
+
+ // If Windows 95:
+ }else if( osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
+ {
+
+
+ hInstLib = LoadLibraryA( "Kernel32.DLL" ) ;
+ if( hInstLib == NULL )
+ return FALSE ;
+
+ // Get procedure addresses.
+ // We are linking to these functions of Kernel32
+ // explicitly, because otherwise a module using
+ // this code would fail to load under Windows NT,
+ // which does not have the Toolhelp32
+ // functions in the Kernel 32.
+ lpfCreateToolhelp32Snapshot=
+ (HANDLE(WINAPI *)(DWORD,DWORD))
+ GetProcAddress( hInstLib,
+ "CreateToolhelp32Snapshot" ) ;
+ lpfProcess32First=
+ (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
+ GetProcAddress( hInstLib, "Process32First" ) ;
+ lpfProcess32Next=
+ (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
+ GetProcAddress( hInstLib, "Process32Next" ) ;
+ if( lpfProcess32Next == NULL ||
+ lpfProcess32First == NULL ||
+ lpfCreateToolhelp32Snapshot == NULL )
+ {
+ FreeLibrary( hInstLib ) ;
+ return FALSE ;
+ }
+
+ // Get a handle to a Toolhelp snapshot of the systems
+ // processes.
+ hSnapShot = lpfCreateToolhelp32Snapshot(
+ TH32CS_SNAPPROCESS, 0 ) ;
+ if( hSnapShot == INVALID_HANDLE_VALUE )
+ {
+ FreeLibrary( hInstLib ) ;
+ return FALSE ;
+ }
+
+ // Get the first process' information.
+ procentry.dwSize = sizeof(PROCESSENTRY32) ;
+ bFlag = lpfProcess32First( hSnapShot, &procentry ) ;
+
+ // While there are processes, keep looping.
+ while( bFlag )
+ {
+ // Call the enum func with the filename and ProcID.
+ if(lpProc( procentry.th32ProcessID, 0,
+ procentry.szExeFile, lParam ))
+ {
+ procentry.dwSize = sizeof(PROCESSENTRY32) ;
+ bFlag = lpfProcess32Next( hSnapShot, &procentry );
+ }else
+ bFlag = FALSE ;
+ }
+
+
+ }else
+ return FALSE ;
+
+ // Free the library.
+ FreeLibrary( hInstLib ) ;
+
+ return TRUE ;
+}
+
+BOOL WINAPI Enum16( DWORD dwThreadId, WORD hMod16, WORD hTask16,
+ PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined )
+{
+ BOOL bRet ;
+
+ EnumInfoStruct *psInfo = (EnumInfoStruct *)lpUserDefined ;
+
+ bRet = psInfo->lpProc( psInfo->dwPID, hTask16, pszFileName,
+ psInfo->lParam ) ;
+
+ if(!bRet)
+ {
+ psInfo->bEnd = TRUE ;
+ }
+
+ return !bRet;
+}
+
+BOOL CALLBACK OutProcInfo( DWORD pid, WORD, LPSTR procName, LPARAM )
+{
+ cout << setw(10) << pid << '\t' << procName << '\n';
+ return TRUE;
+}
diff --git a/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.dsp b/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.dsp
new file mode 100644
index 00000000000..d14d3c49bc1
--- /dev/null
+++ b/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.dsp
@@ -0,0 +1,117 @@
+# Microsoft Developer Studio Project File - Name="listtasks" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=listtasks - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "listtasks.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "listtasks.mak" CFG="listtasks - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "listtasks - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "listtasks - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "listtasks - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+
+!ELSEIF "$(CFG)" == "listtasks - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "listtasks - Win32 Release"
+# Name "listtasks - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\listtasks.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.cpp
+# ADD CPP /Yc"stdafx.h"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\listtasks.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# Begin Source File
+
+SOURCE=.\ReadMe.txt
+# End Source File
+# End Target
+# End Project
diff --git a/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.dsw b/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.dsw
new file mode 100644
index 00000000000..329bd2f44e0
--- /dev/null
+++ b/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "listtasks"=.\listtasks.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.h b/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.h
new file mode 100644
index 00000000000..78976917f13
--- /dev/null
+++ b/core/org.eclipse.cdt.core.win32/library/listtasks/listtasks.h
@@ -0,0 +1,12 @@
+#include <windows.h>
+
+#ifndef __LISTTASKS_H
+#define __LISTTASKS_H
+
+typedef BOOL (CALLBACK *PROCENUMPROC)( DWORD, WORD, LPSTR,
+ LPARAM ) ;
+
+BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam ) ;
+
+
+#endif \ No newline at end of file

Back to the top