Skip Menu |

This queue is for tickets about the Win32-Process-Kill CPAN distribution.

Report information
The Basics
Id: 84843
Status: new
Priority: 0/
Queue: Win32-Process-Kill

People
Owner: Nobody in particular
Requestors: BULKDD [...] cpan.org
Cc:
AdminCc:

Bug Information
Severity: (no value)
Broken in: 2.68
Fixed in: (no value)

Attachments


Subject: many many fixes
Show quoted text
____________________________________________________ * various fixes, v2.68_01 stop handle leaks, NTSTATUS isn't a bool in the traditional sense, 0 is success for example, trim the DLL since no CRT is used, Import() uses boot() now, NTAPI/__stdcall added to main.c to stop crashess, dont use refcnted semantics with ntdll, inline the stubs in main.c for efficiency, use PERL_NO_GET_CONTEXT for efficiency
____________________________________________________ if there was a changelog, that is what I would have put in it, "-" bullet point listed, the changelog file disappeared somewhere between 0.1 and 2.68. Attached is my tarball of changes, basically ready to go on PAUSE/CPAN.
Subject: Win32-Process-Kill-2.68_01.tar.gz

Message body not shown because it is not plain text.

As a diff.
Subject: 0001-various-fixes-v2.68_01.patch
From 3f50e142cc2d7b54d4cd6cc2d4419f5debbdee2d Mon Sep 17 00:00:00 2001 From: bulk88 <bulk88@hotmail.com> Date: Thu, 25 Apr 2013 03:38:49 -0400 Subject: [PATCH] various fixes, v2.68_01 stop handle leaks, NTSTATUS isn't a bool in the traditional sense, 0 is success for example, trim the DLL since no CRT is used, Import() uses boot() now, NTAPI/__stdcall added to main.c to stop crashess, dont use refcnted semantics with ntdll, inline the stubs in main.c for efficiency, use PERL_NO_GET_CONTEXT for efficiency --- Kill.xs | 42 ++++++++++++++++++++++++++++++++++++++---- META.json | 12 ++++++------ META.yml | 6 +++--- lib/Win32/Process/Kill.pm | 21 ++++++++++++++------- main.c | 39 ++++++++++++++++++--------------------- 5 files changed, 79 insertions(+), 41 deletions(-) diff --git a/Kill.xs b/Kill.xs index 15b89e2..fda4138 100644 --- a/Kill.xs +++ b/Kill.xs @@ -1,20 +1,45 @@ +#define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" +#include "SubAuth.h" #include "main.c" +/* remove CRT dependency if possible +2005 and up want their security cookie initialized +Mingw uses Static TLS */ + +#if _MSC_VER < 1400 +BOOL WINAPI _DllMainCRTStartup( + HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpReserved ) +{ + switch( fdwReason ) + { + case DLL_PROCESS_ATTACH: + if(!DisableThreadLibraryCalls(hinstDLL)) return FALSE; + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} +#endif + MODULE = Win32::Process::Kill PACKAGE = Win32::Process::Kill -int -Import () + +BOOT: + if (!Import()) croak("Win32::Process::Kill::boot failed to initialize"); long _GetHandle (int ProcessId) bool -Suspend(long hProcess) +_Suspend(long hProcess) bool -Resume(long hProcess) +_Resume(long hProcess) bool _TerminateProcess(long hProcess) @@ -24,3 +49,12 @@ _CreateRemoteThread(long hProcess) bool _DebugActiveProcess(int ProcessId) + +MODULE = Win32::Process::Kill PACKAGE = Win32::Process::Kill::Handle + +bool +_CloseHandle(HANDLE hProcess) +CODE: + RETVAL = CloseHandle(hProcess); +OUTPUT: + RETVAL diff --git a/META.json b/META.json index 3c5f339..09c6ab0 100644 --- a/META.json +++ b/META.json @@ -1,10 +1,10 @@ { - "abstract" : "Perl extension for Terminating Process in Win32 (R3)\r", + "abstract" : "Perl extension for Terminating Process in Win32 (R3)", "author" : [ "Baggio, Kwok Lok Chung <rootkwok@cpan.org>" ], "dynamic_config" : 1, - "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.113640", + "generated_by" : "ExtUtils::MakeMaker version 6.6302, CPAN::Meta::Converter version 2.120921", "license" : [ "unknown" ], @@ -22,18 +22,18 @@ "prereqs" : { "build" : { "requires" : { - "ExtUtils::MakeMaker" : 0 + "ExtUtils::MakeMaker" : "0" } }, "configure" : { "requires" : { - "ExtUtils::MakeMaker" : 0 + "ExtUtils::MakeMaker" : "0" } }, "runtime" : { "requires" : {} } }, - "release_status" : "stable", - "version" : "2.68" + "release_status" : "testing", + "version" : "2.68_01" } diff --git a/META.yml b/META.yml index f267d19..e479fb6 100644 --- a/META.yml +++ b/META.yml @@ -1,5 +1,5 @@ --- -abstract: "Perl extension for Terminating Process in Win32 (R3)\r" +abstract: 'Perl extension for Terminating Process in Win32 (R3)' author: - 'Baggio, Kwok Lok Chung <rootkwok@cpan.org>' build_requires: @@ -7,7 +7,7 @@ build_requires: configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 -generated_by: 'ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.113640' +generated_by: 'ExtUtils::MakeMaker version 6.6302, CPAN::Meta::Converter version 2.120921' license: unknown meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html @@ -18,4 +18,4 @@ no_index: - t - inc requires: {} -version: 2.68 +version: 2.68_01 diff --git a/lib/Win32/Process/Kill.pm b/lib/Win32/Process/Kill.pm index eb465fb..860fbd5 100644 --- a/lib/Win32/Process/Kill.pm +++ b/lib/Win32/Process/Kill.pm @@ -3,7 +3,7 @@ package Win32::Process::Kill; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(Terminate Resume Suspend CreateRemoteThread DebugActiveProcess Kill GetHandle); -our $VERSION = '2.68'; +our $VERSION = '2.68_01'; require XSLoader; XSLoader::load('Win32::Process::Kill', $VERSION); use Carp qw' croak carp '; @@ -12,9 +12,9 @@ $::DEBUG = 0; sub GetHandle { map Win32::Process::Kill::_GetHandle($_), @_ } -sub Suspend { map Win32::Process::Kill::Suspend($_), @_ } +sub Suspend { map Win32::Process::Kill::_Suspend($_), @_ } -sub Resume { map Win32::Process::Kill::Resume($_), @_ } +sub Resume { map Win32::Process::Kill::_Resume($_), @_ } sub Terminate { map Win32::Process::Kill::_TerminateProcess($_), @_ } @@ -28,7 +28,8 @@ sub Kill { return 0 unless $_; my ($handle) = GetHandle($_); - + my $ref = \$handle; + bless($ref, 'Win32::Process::Kill::Handle'); if ( ! Win32::Process::Kill::Suspend($handle) && $::DEBUG > 0 ) { carp "Failed to Suspend Process...\nBut still fine\n"; @@ -41,15 +42,19 @@ sub Kill { return 0; } - Win32::Process::Kill::Resume($_); - close $handle; + Win32::Process::Kill::_Resume($_); return 1; } @_ ? @_ : $_; } -Win32::Process::Kill::Import() +package Win32::Process::Kill::Handle; +sub DESTROY { + die "CloseHandle failed" if !_CloseHandle(${$_[0]}) && $::DEBUG > 0; +} + +1; __END__ =head1 NAME @@ -140,6 +145,8 @@ or Baggio, Kwok Lok Chung. <rootkwok <AT> cpan <DOT> org> +patches by Daniel Dragan <bulkdd <AT> cpan <DOT> org> + =head1 COPYRIGHT AND LICENSE Copyright (C) 2009 by Baggio, Kwok Lok Chung diff --git a/main.c b/main.c index 8cb2178..7146722 100644 --- a/main.c +++ b/main.c @@ -1,38 +1,35 @@ -typedef DWORD (*pNtTerminateProcess)(HANDLE,UINT); +#define W32PK_SEDEBUG 20 +typedef DWORD (NTAPI *pNtTerminateProcess)(HANDLE,UINT); pNtTerminateProcess NtTerminateProcess; -typedef LONG (*pRtlAdjustPrivilege)(int,BOOL,BOOL,int*); -pRtlAdjustPrivilege RtlAdjPriv = NULL; - -typedef LONG (*pNtSuspendProcess )( HANDLE ProcessHandle ); -typedef LONG (*pNtResumeProcess )( HANDLE ProcessHandle ); -pNtSuspendProcess NtSuspendProcess = NULL; -pNtResumeProcess NtResumeProcess = NULL; +typedef LONG (NTAPI *pNtSuspendProcess )( HANDLE ProcessHandle ); +pNtSuspendProcess NtSuspendProcess; +typedef LONG (NTAPI *pNtResumeProcess )( HANDLE ProcessHandle ); +pNtResumeProcess NtResumeProcess; int Import (void) { - HMODULE ntdll = LoadLibrary( "ntdll.dll" ); + HMODULE ntdll = GetModuleHandle( "ntdll.dll" ); if (!ntdll) return 0; - RtlAdjPriv = (pRtlAdjustPrivilege) GetProcAddress(ntdll,"RtlAdjustPrivilege"); NtTerminateProcess = (pNtTerminateProcess)GetProcAddress( ntdll, "NtTerminateProcess"); NtSuspendProcess = (pNtSuspendProcess)GetProcAddress(ntdll, "NtSuspendProcess" ); NtResumeProcess = (pNtResumeProcess)GetProcAddress(ntdll, "NtResumeProcess" ); - FreeLibrary(ntdll); - { - int prtn; - RtlAdjPriv(20,TRUE,FALSE,&prtn); + { + NTSTATUS (NTAPI * RtlAdjustPrivilege) (ULONG, BOOLEAN, BOOLEAN, PBOOLEAN) + = (NTSTATUS (NTAPI *) (ULONG, BOOLEAN, BOOLEAN, PBOOLEAN)) GetProcAddress(ntdll,"RtlAdjustPrivilege"); + BOOLEAN prtn; + if(RtlAdjustPrivilege(W32PK_SEDEBUG,TRUE,FALSE,&prtn) != STATUS_SUCCESS) return 0; } - RtlAdjPriv = NULL; return 1; } -long _GetHandle (int ProcessId){ return (LONG)OpenProcess(PROCESS_ALL_ACCESS, (bool)TRUE, (HANDLE)(ProcessId + 3)); } +__forceinline long _GetHandle (int ProcessId){ return (LONG)OpenProcess(PROCESS_ALL_ACCESS, (bool)TRUE, (HANDLE)ProcessId); } -bool Suspend(long hProcess){ return (bool)NtSuspendProcess((HANDLE)hProcess); } -bool Resume (long hProcess){ return (bool)NtResumeProcess((HANDLE)hProcess); } +__forceinline bool _Suspend(long hProcess){ return (bool)NT_SUCCESS(NtSuspendProcess((HANDLE)hProcess)); } +__forceinline bool _Resume (long hProcess){ return (bool)NT_SUCCESS(NtResumeProcess((HANDLE)hProcess)); } -bool _TerminateProcess (long hProcess) { return (bool)NtTerminateProcess((HANDLE)hProcess, 1); } +__forceinline bool _TerminateProcess (long hProcess) { return (bool)NT_SUCCESS(NtTerminateProcess((HANDLE)hProcess, 1)); } -bool _CreateRemoteThread (long hProcess) { return (bool)CreateRemoteThread((HANDLE)hProcess,0,0,(DWORD (__stdcall *)(void *))150,0,0,0); } +__forceinline bool _CreateRemoteThread (long hProcess) { return (bool)CreateRemoteThread((HANDLE)hProcess,0,0,(DWORD (__stdcall *)(void *))150,0,0,0); } -bool _DebugActiveProcess (int ProcessId) { return (bool)DebugActiveProcess((int)ProcessId); } +__forceinline bool _DebugActiveProcess (int ProcessId) { return (bool)DebugActiveProcess((int)ProcessId); } -- 1.7.9.msysgit.0