[prev in list] [next in list] [prev in thread] [next in thread] 

List:       perl-win32-users
Subject:    Re: Win32 API problem (pack,unpack)
From:       "$Bill Luebkert" <dbecoll () adelphia ! net>
Date:       2004-08-29 2:51:32
Message-ID: 413144B4.4060202 () adelphia ! net
[Download RAW message or body]

Jeremy A wrote:
> Hi all,
> 
> I have some more  Win32 API problem's. it could be something to do with the
> way I am packing/unpacking.
> 
> 
> the Following documentation, I found on MSDN.
> ----------------------------------------------------------------------------------------------------------------------------
>  GetModuleFileName
> 
> The GetModuleFileName function retrieves the fully-qualified path for the
> file containing the specified module.
> 
> To specify the process that contains the module, use the
> GetModuleFileNameEx function.
> 
> 
> DWORD GetModuleFileName(
> HMODULE hModule,
> LPTSTR lpFilename,
> DWORD nSize
> );
> 
> Parameters
> hModule
> [in] Handle to the module whose path is being requested. If this parameter
> is NULL, GetModuleFileName retrieves the path of the executable file of the
> current process.
> lpFilename
> [out] Pointer to a buffer that receives a null-terminated string that
> specifies the fully-qualified path of the module. If the length of the path
> exceeds the size specified by the nSize parameter, the function succeeds
> and the string is truncated to nSize characters and may not be null terminated.
> To separate the path from the file name and extension, use the
> PathRemoveFileSpec function.
> 
> The path can have the prefix "\\?\", depending on how the module was
> loaded. For more information, see Naming a File.
> 
> nSize
> [in] Size of the lpFilename buffer, in TCHARs.
> Return Values
> If the function succeeds, the return value is the length of the string
> copied to the buffer, in TCHARs. If the buffer is too small to hold the
> module name, the string is truncated to nSize, and the function returns nSize.
> 
> If the function fails, the return value is zero. To get extended error
> information, call GetLastError.
> -------------------------------------------------------------------------
> OpenProcess
> 
> The OpenProcess function opens an existing process object.
> 
> 
> HANDLE OpenProcess(
> DWORD dwDesiredAccess,
> BOOL bInheritHandle,
> DWORD dwProcessId
> );
> 
> Parameters
> dwDesiredAccess
> [in] Access to the process object. This access right is checked against any
> security descriptor for the process. This parameter can be one or more of
> the process access rights.
> bInheritHandle
> [in] If this parameter is TRUE, the handle is inheritable. If the parameter
> is FALSE, the handle cannot be inherited.
> dwProcessId
> [in] Identifier of the process to open.
> Return Values
> If the function succeeds, the return value is an open handle to the
> specified process.
> 
> If the function fails, the return value is NULL. To get extended error
> information, call GetLastError.
> -------------------------------------------------------------------------------------------------------------------
>  
> The following is my perl code, given that I know the Window Handle ($HWND).
> The script crashes with a message about memory addresses.
> 
> 
> 
> 
> my $GetWindowThreadProcessId = new Win32::API("user32",
> "GetWindowThreadProcessId", [N,P], 'N');
> 
> my $P = pack 'L', 0;
> my $TID = $GetWindowThreadProcessId->Call($HWND, $P); # or
> die "GetWindowThreadProcessId->Call: $!";
> $P = unpack 'L', $P;
> 
> my $OpenProcess = new Win32::API("kernel32",
> "OpenProcess",[N,N,N],'N');
> 
> my $PH = $OpenProcess->Call(PROCESS_ALL_ACCESS,0,$P);
> print $PH,"\n";
> 
> my $GetModuleFileName = new Win32::API("kernel32",
> "GetModuleFileName",[N,P,N],'P');
> 
> my $FileName = pack 'P','\0';
> my $STR = pack 'P','\0';
> $FileName = $GetModuleFileName->Call($PH,$STR,80);
> $STR = unpack 'P',$STR;
> $FileName = unpack 'P',$FileName;
> print $FileName,":",$STR,"\n";
> 
> 
> Thanks in advance for all help,

This works for the caller task (rather than a module handle) :

use strict;
use Win32::API;

# HWND FindWindow(LPCTSTR lpClassName,	LPCTSTR lpWindowName);

my $FindWindow = new Win32::API('USER32', 'FindWindow', 'PP', 'N') or
  die "FindWindow: $!";
my $hWnd = $FindWindow->Call(0, 0);
print "hWnd=$hWnd\n";

# DWORD GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId);

my $GetWindowThreadProcessId = new Win32::API('user32',
  'GetWindowThreadProcessId', 'LP', 'N') or
  die "get GetWindowThreadProcessId: $!";
my $lpdwProcessId = pack 'L', 0;
my $CTID = $GetWindowThreadProcessId->Call($hWnd, $lpdwProcessId) or
  die "GetWindowThreadProcessId->Call: $!";
my $dwProcessId = unpack 'L', $lpdwProcessId;
printf "CTID=$CTID; lpdwProcessId=$dwProcessId\n";

# HANDLE OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle,
#   DWORD dwProcessId);

my $OpenProcess = new Win32::API('kernel32', 'OpenProcess', 'ILI', 'N') or
  die "get OpenProcess: $!";
use constant SYNCHRONIZE => 0x00100000;
use constant STANDARD_RIGHTS_REQUIRED => 0x000F0000;
use constant PROCESS_ALL_ACCESS => (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE |
  0xFFF);
my $dwDesiredAccess = PROCESS_ALL_ACCESS;
my $bInheritHandle = 0;
printf "dwDesiredAccess=%08X\n", $dwDesiredAccess;
my $handle = $OpenProcess->Call($dwDesiredAccess, $bInheritHandle,
  $dwProcessId);
print "handle='$handle'\n";

# DWORD GetModuleFileName(HMODULE hModule, LPTSTR lpFilename, DWORD nSize);

my $GetModuleFileName = new Win32::API('kernel32', 'GetModuleFileName', 'LPI',
  'N') or die "get GetModuleFileName: $!";
my $nSize = 256;
my $lpFilename = ' ' x $nSize;

# maybe your handle will work on the next line, I oculd only get it to work
# using the default handle (0)

# my $ret = $GetModuleFileName->Call($handle, $lpFilename, 256) or
my $ret = $GetModuleFileName->Call(0, $lpFilename, $nSize) or
  die "GetModuleFileName->Call: $!";
print "ret=$ret\n";
printf "FileName=%s\n", unpack 'A*', $lpFilename;

__END__

Output:
hWnd15222
CTID020; lpdwProcessId348  (3348 is Netscape ???)
dwDesiredAccess1F0FFF
handle='1980'
ret 
FileName=F:\perl\bin\perl.exe

--
  ,-/-  __      _  _         $Bill Luebkert    Mailto:dbecoll@adelphia.net
 (_/   /  )    // //       DBE Collectibles    Mailto:dbe@todbe.com
  / ) /--<  o // //      Castle of Medieval Myth & Magic http://www.todbe.com/
-/-' /___/_<_</_</_    http://dbecoll.tripod.com/ (My Perl/Lakers stuff)
_______________________________________________
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic