JobObjectSecurityLimitInformation Invalid handle

JobObjectSecurityLimitInformation Invalid handle
2012-11-19T14:14:29+01:00
2012-11-19T14:14:31+01:00
2022-11-27T11:35:46+01:00
kampi
Helló!

Van egy program, ami elindít egy paraméterül kapott programot, majd addig vár, amíg az véget nem ér, ill. ha az további folyamatot indít, akkor azokat is megvárja. A probléma XP-n jelentkezik, amikor is a AssignProcessToJobObject 5-ös hibát ad vissza(Access Denied.) Windows 7-en természetesen jó, de sajnos XP-n is mennie kell. Kód:

#include <windows.h> #include <stdio.h> #include <shlwapi.h> #pragma comment ( lib, "shlwapi.lib" ) int __cdecl wmain( int argc, PWSTR argv[] ) { HANDLE Job( CreateJobObject( NULL, NULL ) ); if( !Job ) { wprintf( L"Could not create job object, error %d\n", GetLastError() ); return 0; } HANDLE IOPort( CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 1 ) ); if( !IOPort ) { wprintf( L"Could not create IO completion port, error %d\n", GetLastError() ); return 0; } JOBOBJECT_ASSOCIATE_COMPLETION_PORT Port; Port.CompletionKey = Job; Port.CompletionPort = IOPort; if( !SetInformationJobObject( Job, JobObjectAssociateCompletionPortInformation, &Port, sizeof( Port ) ) ) { wprintf( L"Could not associate job with IO completion port, error %d\n", GetLastError() ); return 0; } PROCESS_INFORMATION ProcessInformation; STARTUPINFO StartupInfo = { sizeof(StartupInfo) }; PWSTR CommandLine = PathGetArgs(GetCommandLine()); if( !CreateProcess( NULL, CommandLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | CREATE_SUSPENDED, NULL, NULL, &StartupInfo, &ProcessInformation ) ) { wprintf( L"Could not run process, error %d\n", GetLastError() ); return 0; } if( !AssignProcessToJobObject( Job, ProcessInformation.hProcess ) ) { wprintf( L"Could not assign process to job, error %d\n", GetLastError() ); return 0; } ResumeThread( ProcessInformation.hThread ); CloseHandle( ProcessInformation.hThread ); CloseHandle( ProcessInformation.hProcess ); DWORD CompletionCode; ULONG_PTR CompletionKey; LPOVERLAPPED Overlapped; int ProcessCount = 0; while ( GetQueuedCompletionStatus( IOPort, &CompletionCode, &CompletionKey, &Overlapped, INFINITE ) && CompletionCode != JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO ) { if ( CompletionCode == JOB_OBJECT_MSG_NEW_PROCESS ) ProcessCount++; if ( ( CompletionCode == JOB_OBJECT_MSG_EXIT_PROCESS ) || ( CompletionCode == JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS) ) ProcessCount--; wprintf( L"Waiting for %d processes to finish...\n", ProcessCount ); } wprintf( L"All done\n" ); return 0; }

Link szerint JOB_OBJECT_SECURITY_ONLY_TOKEN jogot kell adni a JobObjectnek, amit én az alábbi módon szeretnék megadni:

HANDLE Job( CreateJobObject( NULL, NULL ) ); if( !Job ) { wprintf( L"Could not create job object, error %d\n", GetLastError() ); return 1; } JOBOBJECT_SECURITY_LIMIT_INFORMATION SecLimit = { 0 }; SecLimit.SecurityLimitFlags = JOB_OBJECT_SECURITY_ONLY_TOKEN; if ( !SetInformationJobObject( Job, JobObjectSecurityLimitInformation, &SecLimit, sizeof( SecLimit ) ) ) { wprintf( L"Could not associate job with IO completion port, error %d\n", GetLastError() ); return 1; }

Itt azonban a JobObjectSecurityLimitInformation függvény 6-os hibával ( Invalid handle ) száll el.

Tudna valaki segíteni, hogy mi lehet a probléma?

Köszi!
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd