/* * @implemented */ BOOL WINAPI DebugActiveProcess(IN DWORD dwProcessId) { NTSTATUS Status; HANDLE Handle; /* Connect to the debugger */ Status = DbgUiConnectToDbg(); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } /* Get the process handle */ Handle = ProcessIdToHandle(dwProcessId); if (!Handle) return FALSE; /* Now debug the process */ Status = DbgUiDebugActiveProcess(Handle); NtClose(Handle); /* Check if debugging worked */ if (!NT_SUCCESS(Status)) { /* Fail */ SetLastErrorByStatus(Status); return FALSE; } /* Success */ return TRUE; }
/* * @implemented */ BOOL WINAPI DebugSetProcessKillOnExit(IN BOOL KillOnExit) { HANDLE Handle; NTSTATUS Status; ULONG State; /* Get the debug object */ Handle = DbgUiGetThreadDebugObject(); if (!Handle) { /* Fail */ SetLastErrorByStatus(STATUS_INVALID_HANDLE); return FALSE; } /* Now set the kill-on-exit state */ State = KillOnExit; Status = NtSetInformationDebugObject(Handle, DebugObjectKillProcessOnExitInformation, &State, sizeof(State), NULL); if (!NT_SUCCESS(Status)) { /* Fail */ SetLastErrorByStatus(Status); return FALSE; } /* Success */ return TRUE; }
/* * @implemented */ BOOL WINAPI QueryFullProcessImageNameW(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD pdwSize) { BYTE Buffer[sizeof(UNICODE_STRING) + MAX_PATH * sizeof(WCHAR)]; UNICODE_STRING *DynamicBuffer = NULL; UNICODE_STRING *Result = NULL; NTSTATUS Status; DWORD Needed; Status = NtQueryInformationProcess(hProcess, ProcessImageFileName, Buffer, sizeof(Buffer) - sizeof(WCHAR), &Needed); if (Status == STATUS_INFO_LENGTH_MISMATCH) { DynamicBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Needed + sizeof(WCHAR)); if (!DynamicBuffer) { SetLastErrorByStatus(STATUS_NO_MEMORY); return FALSE; } Status = NtQueryInformationProcess(hProcess, ProcessImageFileName, (LPBYTE)DynamicBuffer, Needed, &Needed); Result = DynamicBuffer; } else Result = (PUNICODE_STRING)Buffer; if (!NT_SUCCESS(Status)) goto Cleanup; if (Result->Length / sizeof(WCHAR) + 1 > *pdwSize) { Status = STATUS_BUFFER_TOO_SMALL; goto Cleanup; } *pdwSize = Result->Length / sizeof(WCHAR); memcpy(lpExeName, Result->Buffer, Result->Length); lpExeName[*pdwSize] = 0; Cleanup: RtlFreeHeap(RtlGetProcessHeap(), 0, DynamicBuffer); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); } return !Status; }
/* * @implemented */ BOOL WINAPI GetHandleInformation (HANDLE hObject, LPDWORD lpdwFlags) { OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; ULONG BytesWritten; NTSTATUS Status; DWORD Flags; // hObject = TranslateStdHandle(hObject); Status = NtQueryObject (hObject, ObjectHandleFlagInformation, &HandleInfo, sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION), &BytesWritten); if (NT_SUCCESS(Status)) { Flags = 0; if (HandleInfo.Inherit) Flags |= HANDLE_FLAG_INHERIT; if (HandleInfo.ProtectFromClose) Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE; *lpdwFlags = Flags; return TRUE; } else { SetLastErrorByStatus (Status); return FALSE; } }
/* * @implemented */ BOOL WINAPI SetEnvironmentVariableW ( LPCWSTR lpName, LPCWSTR lpValue ) { UNICODE_STRING VarName; UNICODE_STRING VarValue; NTSTATUS Status; DPRINT("SetEnvironmentVariableW(Name '%S', Value '%S')\n", lpName, lpValue); RtlInitUnicodeString (&VarName, lpName); RtlInitUnicodeString (&VarValue, lpValue); Status = RtlSetEnvironmentVariable (NULL, &VarName, &VarValue); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus (Status); return FALSE; } return TRUE; }
/* * @implemented */ BOOL WINAPI ReadFileEx(IN HANDLE hFile, IN LPVOID lpBuffer, IN DWORD nNumberOfBytesToRead OPTIONAL, IN LPOVERLAPPED lpOverlapped, IN LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) { LARGE_INTEGER Offset; NTSTATUS Status; Offset.u.LowPart = lpOverlapped->Offset; Offset.u.HighPart = lpOverlapped->OffsetHigh; lpOverlapped->Internal = STATUS_PENDING; Status = NtReadFile(hFile, NULL, ApcRoutine, lpCompletionRoutine, (PIO_STATUS_BLOCK)lpOverlapped, lpBuffer, nNumberOfBytesToRead, &Offset, NULL); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } return TRUE; }
/* * @implemented */ BOOL WINAPI CheckRemoteDebuggerPresent(IN HANDLE hProcess, OUT PBOOL pbDebuggerPresent) { HANDLE DebugPort; NTSTATUS Status; /* Make sure we have an output and process*/ if (!(pbDebuggerPresent) || !(hProcess)) { /* Fail */ SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } /* Check if the process has a debug object/port */ Status = NtQueryInformationProcess(hProcess, ProcessDebugPort, (PVOID)&DebugPort, sizeof(HANDLE), NULL); if (NT_SUCCESS(Status)) { /* Return the current state */ *pbDebuggerPresent = (DebugPort) ? TRUE : FALSE; return TRUE; } /* Otherwise, fail */ SetLastErrorByStatus(Status); return FALSE; }
/* * @implemented */ HANDLE WINAPI CreateSemaphoreExW(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL, IN LONG lInitialCount, IN LONG lMaximumCount, IN LPCWSTR lpName OPTIONAL, IN DWORD dwFlags, IN DWORD dwDesiredAccess) { NTSTATUS Status; OBJECT_ATTRIBUTES LocalAttributes; POBJECT_ATTRIBUTES ObjectAttributes; HANDLE Handle; UNICODE_STRING ObjectName; /* Now check if we got a name */ if (lpName) RtlInitUnicodeString(&ObjectName, lpName); if (dwFlags != 0) { SetLastError(ERROR_INVALID_PARAMETER); return NULL; } /* Now convert the object attributes */ ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes, lpSemaphoreAttributes, lpName ? &ObjectName : NULL); /* Create the semaphore */ Status = NtCreateSemaphore(&Handle, (ACCESS_MASK)dwDesiredAccess, ObjectAttributes, lInitialCount, lMaximumCount); if (NT_SUCCESS(Status)) { /* Check if the object already existed */ if (Status == STATUS_OBJECT_NAME_EXISTS) { /* Set distinguished Win32 error code */ SetLastError(ERROR_ALREADY_EXISTS); } else { /* Otherwise, set success */ SetLastError(ERROR_SUCCESS); } /* Return the handle */ return Handle; } else { /* Convert the NT Status and fail */ SetLastErrorByStatus(Status); return NULL; } }
HANDLE WINAPI ProcessIdToHandle(IN DWORD dwProcessId) { NTSTATUS Status; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE Handle; CLIENT_ID ClientId; /* If we don't have a PID, look it up */ if (dwProcessId == MAXDWORD) dwProcessId = (DWORD_PTR)CsrGetProcessId(); /* Open a handle to the process */ ClientId.UniqueThread = NULL; ClientId.UniqueProcess = UlongToHandle(dwProcessId); InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); Status = NtOpenProcess(&Handle, PROCESS_ALL_ACCESS, &ObjectAttributes, &ClientId); if (!NT_SUCCESS(Status)) { /* Fail */ SetLastErrorByStatus(Status); return 0; } /* Return the handle */ return Handle; }
/* * @implemented */ BOOL WINAPI CloseHandle(HANDLE hObject) /* * FUNCTION: Closes an open object handle * PARAMETERS: * hObject = Identifies an open object handle * RETURNS: If the function succeeds, the return value is nonzero * If the function fails, the return value is zero */ { NTSTATUS Status; hObject = TranslateStdHandle(hObject); if (IsConsoleHandle(hObject)) { return(CloseConsoleHandle(hObject)); } Status = NtClose(hObject); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus (Status); return FALSE; } return TRUE; }
/* * @implemented */ BOOL WINAPI QueryMemoryResourceNotification( HANDLE ResourceNotificationHandle, PBOOL ResourceState ) { EVENT_BASIC_INFORMATION ebi; NTSTATUS Status; if(ResourceState != NULL) { Status = NtQueryEvent(ResourceNotificationHandle, EventBasicInformation, &ebi, sizeof(ebi), NULL); if(NT_SUCCESS(Status)) { *ResourceState = ebi.EventState; return TRUE; } SetLastErrorByStatus(Status); } else /* ResourceState == NULL */ { SetLastError(ERROR_INVALID_PARAMETER); } return FALSE; }
/* * @implemented */ HANDLE WINAPI OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId) { NTSTATUS errCode; HANDLE ProcessHandle; OBJECT_ATTRIBUTES ObjectAttributes; CLIENT_ID ClientId; ClientId.UniqueProcess = UlongToHandle(dwProcessId); ClientId.UniqueThread = 0; InitializeObjectAttributes(&ObjectAttributes, NULL, (bInheritHandle ? OBJ_INHERIT : 0), NULL, NULL); errCode = NtOpenProcess(&ProcessHandle, dwDesiredAccess, &ObjectAttributes, &ClientId); if (!NT_SUCCESS(errCode)) { SetLastErrorByStatus(errCode); return NULL; } return ProcessHandle; }
/* * @implemented */ BOOL WINAPI ContinueDebugEvent(IN DWORD dwProcessId, IN DWORD dwThreadId, IN DWORD dwContinueStatus) { CLIENT_ID ClientId; NTSTATUS Status; /* Set the Client ID */ ClientId.UniqueProcess = (HANDLE)dwProcessId; ClientId.UniqueThread = (HANDLE)dwThreadId; /* Continue debugging */ Status = DbgUiContinue(&ClientId, dwContinueStatus); if (!NT_SUCCESS(Status)) { /* Fail */ SetLastErrorByStatus(Status); return FALSE; } /* Remove the process/thread handles */ RemoveHandles(dwProcessId, dwThreadId); /* Success */ return TRUE; }
/* * @implemented */ BOOL WINAPI GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorkingSetSize, PSIZE_T lpMaximumWorkingSetSize) { QUOTA_LIMITS QuotaLimits; NTSTATUS Status; Status = NtQueryInformationProcess(hProcess, ProcessQuotaLimits, &QuotaLimits, sizeof(QUOTA_LIMITS), NULL); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } *lpMinimumWorkingSetSize = QuotaLimits.MinimumWorkingSetSize; *lpMaximumWorkingSetSize = QuotaLimits.MaximumWorkingSetSize; return TRUE; }
/* * @implemented */ BOOL WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS PowerStatus) { NTSTATUS Status; SYSTEM_BATTERY_STATE SysBatState; Status = NtPowerInformation(SystemBatteryState, NULL, 0, &SysBatState, sizeof(SYSTEM_BATTERY_STATE)); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } RtlZeroMemory(PowerStatus, sizeof(LPSYSTEM_POWER_STATUS)); PowerStatus->BatteryLifeTime = BATTERY_LIFE_UNKNOWN; PowerStatus->BatteryFullLifeTime = BATTERY_LIFE_UNKNOWN; PowerStatus->BatteryLifePercent = BATTERY_PERCENTAGE_UNKNOWN; if (SysBatState.MaxCapacity) { if (SysBatState.MaxCapacity >= SysBatState.RemainingCapacity) PowerStatus->BatteryLifePercent = (SysBatState.RemainingCapacity / SysBatState.MaxCapacity) * 100; else PowerStatus->BatteryLifePercent = 100; /* 100% */ if (PowerStatus->BatteryLifePercent <= 32) PowerStatus->BatteryFlag |= BATTERY_FLAG_LOW; if (PowerStatus->BatteryLifePercent >= 67) PowerStatus->BatteryFlag |= BATTERY_FLAG_HIGH; } if (!SysBatState.BatteryPresent) PowerStatus->BatteryFlag |= BATTERY_FLAG_NO_BATTERY; if (SysBatState.Charging) PowerStatus->BatteryFlag |= BATTERY_FLAG_CHARGING; if (!SysBatState.AcOnLine && SysBatState.BatteryPresent) PowerStatus->ACLineStatus = AC_LINE_OFFLINE; else PowerStatus->ACLineStatus = AC_LINE_ONLINE; if (SysBatState.EstimatedTime) PowerStatus->BatteryLifeTime = SysBatState.EstimatedTime; return TRUE; }
/* * @implemented */ BOOL WINAPI SetHandleInformation (HANDLE hObject, DWORD dwMask, DWORD dwFlags) { OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; ULONG BytesWritten; NTSTATUS Status; hObject = TranslateStdHandle(hObject); Status = NtQueryObject (hObject, ObjectHandleFlagInformation, &HandleInfo, sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION), &BytesWritten); if (NT_SUCCESS(Status)) { if (dwMask & HANDLE_FLAG_INHERIT) HandleInfo.Inherit = (dwFlags & HANDLE_FLAG_INHERIT) != 0; if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE) HandleInfo.ProtectFromClose = (dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0; Status = NtSetInformationObject (hObject, ObjectHandleFlagInformation, &HandleInfo, sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION)); if(!NT_SUCCESS(Status)) { SetLastErrorByStatus (Status); return FALSE; } return TRUE; } else { SetLastErrorByStatus (Status); return FALSE; } }
/* * @implemented */ BOOL WINAPI SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass) { NTSTATUS Status; PROCESS_PRIORITY_CLASS PriorityClass; switch (dwPriorityClass) { case IDLE_PRIORITY_CLASS: PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_IDLE; break; case BELOW_NORMAL_PRIORITY_CLASS: PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_BELOW_NORMAL; break; case NORMAL_PRIORITY_CLASS: PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_NORMAL; break; case ABOVE_NORMAL_PRIORITY_CLASS: PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_ABOVE_NORMAL; break; case HIGH_PRIORITY_CLASS: PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_HIGH; break; case REALTIME_PRIORITY_CLASS: PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_REALTIME; break; default: SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } PriorityClass.Foreground = FALSE; Status = NtSetInformationProcess(hProcess, ProcessPriorityClass, &PriorityClass, sizeof(PROCESS_PRIORITY_CLASS)); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } return TRUE; }
/* * @implemented */ HANDLE WINAPI OpenSemaphoreW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName) { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING ObjectName; NTSTATUS Status; HANDLE Handle; /* Make sure we got a name */ if (!lpName) { /* Fail without one */ SetLastErrorByStatus(STATUS_INVALID_PARAMETER); return NULL; } /* Initialize the object name and attributes */ RtlInitUnicodeString(&ObjectName, lpName); InitializeObjectAttributes(&ObjectAttributes, &ObjectName, bInheritHandle ? OBJ_INHERIT : 0, hBaseDir, NULL); /* Open the semaphore */ Status = NtOpenSemaphore(&Handle, dwDesiredAccess, &ObjectAttributes); if (!NT_SUCCESS(Status)) { /* Convert the status and fail */ SetLastErrorByStatus(Status); return NULL; } /* Return the handle */ return Handle; }
/* * @implemented */ BOOL WINAPI SetEnvironmentVariableA ( LPCSTR lpName, LPCSTR lpValue ) { ANSI_STRING VarName; ANSI_STRING VarValue; UNICODE_STRING VarNameU; UNICODE_STRING VarValueU; NTSTATUS Status; DPRINT("SetEnvironmentVariableA(Name '%s', Value '%s')\n", lpName, lpValue); RtlInitAnsiString (&VarName, (LPSTR)lpName); RtlAnsiStringToUnicodeString (&VarNameU, &VarName, TRUE); if (lpValue) { RtlInitAnsiString (&VarValue, (LPSTR)lpValue); RtlAnsiStringToUnicodeString (&VarValueU, &VarValue, TRUE); Status = RtlSetEnvironmentVariable (NULL, &VarNameU, &VarValueU); RtlFreeUnicodeString (&VarValueU); } else { Status = RtlSetEnvironmentVariable (NULL, &VarNameU, NULL); } RtlFreeUnicodeString (&VarNameU); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus (Status); return FALSE; } return TRUE; }
/* * @implemented */ BOOL WINAPI TlsFree(DWORD Index) { BOOL BitSet; if (Index >= TLS_EXPANSION_SLOTS + TLS_MINIMUM_AVAILABLE) { SetLastErrorByStatus(STATUS_INVALID_PARAMETER); return FALSE; } RtlAcquirePebLock(); if (Index >= TLS_MINIMUM_AVAILABLE) { BitSet = RtlAreBitsSet(NtCurrentPeb()->TlsExpansionBitmap, Index - TLS_MINIMUM_AVAILABLE, 1); if (BitSet) RtlClearBits(NtCurrentPeb()->TlsExpansionBitmap, Index - TLS_MINIMUM_AVAILABLE, 1); } else { BitSet = RtlAreBitsSet(NtCurrentPeb()->TlsBitmap, Index, 1); if (BitSet) RtlClearBits(NtCurrentPeb()->TlsBitmap, Index, 1); } if (BitSet) { /* Clear the TLS cells (slots) in all threads of the current process. */ NtSetInformationThread(NtCurrentThread(), ThreadZeroTlsCell, &Index, sizeof(DWORD)); } else { SetLastError(ERROR_INVALID_PARAMETER); } RtlReleasePebLock(); return BitSet; }
/* * @implemented */ BOOL WINAPI GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, PDWORD_PTR lpSystemAffinityMask) { PROCESS_BASIC_INFORMATION ProcessInfo; SYSTEM_BASIC_INFORMATION SystemInfo; NTSTATUS Status; Status = NtQuerySystemInformation(SystemBasicInformation, &SystemInfo, sizeof(SystemInfo), NULL); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } Status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, (PVOID)&ProcessInfo, sizeof(PROCESS_BASIC_INFORMATION), NULL); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } *lpProcessAffinityMask = (DWORD)ProcessInfo.AffinityMask; *lpSystemAffinityMask = (DWORD)SystemInfo.ActiveProcessorsAffinityMask; return TRUE; }
/* * @implemented */ BOOL WINAPI CancelDeviceWakeupRequest(HANDLE hDevice) { NTSTATUS Status; Status = NtCancelDeviceWakeupRequest(hDevice); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } return TRUE; }
/* * @implemented */ BOOL WINAPI ReleaseSemaphore(IN HANDLE hSemaphore, IN LONG lReleaseCount, IN LPLONG lpPreviousCount) { NTSTATUS Status; /* Release the semaphore */ Status = NtReleaseSemaphore(hSemaphore, lReleaseCount, lpPreviousCount); if (NT_SUCCESS(Status)) return TRUE; /* If we got here, then we failed */ SetLastErrorByStatus(Status); return FALSE; }
/* * @implemented */ BOOL WINAPI RequestWakeupLatency(LATENCY_TIME latency) { NTSTATUS Status; Status = NtRequestWakeupLatency(latency); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } return TRUE; }
/* * @implemented */ EXECUTION_STATE WINAPI SetThreadExecutionState(EXECUTION_STATE esFlags) { EXECUTION_STATE OldFlags; NTSTATUS Status; Status = NtSetThreadExecutionState(esFlags, &OldFlags); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return 0; } return OldFlags; }
/* * @implemented */ BOOL WINAPI DebugBreakProcess(IN HANDLE Process) { NTSTATUS Status; /* Send the breakin request */ Status = DbgUiIssueRemoteBreakin(Process); if(!NT_SUCCESS(Status)) { /* Failure */ SetLastErrorByStatus(Status); return FALSE; } /* Success */ return TRUE; }
/* * @implemented */ DWORD WINAPI GetEnvironmentVariableW ( LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize ) { UNICODE_STRING VarName; UNICODE_STRING VarValue; NTSTATUS Status; RtlInitUnicodeString (&VarName, lpName); VarValue.Length = 0; VarValue.MaximumLength = (USHORT) (nSize ? nSize - 1 : 0) * sizeof(WCHAR); VarValue.Buffer = lpBuffer; Status = RtlQueryEnvironmentVariable_U (NULL, &VarName, &VarValue); if (!NT_SUCCESS(Status)) { if (Status == STATUS_BUFFER_TOO_SMALL) { return (VarValue.Length / sizeof(WCHAR)) + 1; } else { SetLastErrorByStatus (Status); return 0; } } if (nSize != 0) { /* make sure the string is NULL-terminated! RtlQueryEnvironmentVariable_U only terminates it if MaximumLength < Length */ lpBuffer[VarValue.Length / sizeof(WCHAR)] = L'\0'; } return (VarValue.Length / sizeof(WCHAR)); }
/* * @implemented */ BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions) { DWORD SourceProcessId, TargetProcessId; NTSTATUS Status; hSourceHandle = TranslateStdHandle(hSourceHandle); if (IsConsoleHandle(hSourceHandle)) { SourceProcessId = GetProcessId(hSourceProcessHandle); TargetProcessId = GetProcessId(hTargetProcessHandle); if (!SourceProcessId || !TargetProcessId || SourceProcessId != TargetProcessId || SourceProcessId != GetCurrentProcessId()) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } *lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions); return *lpTargetHandle != INVALID_HANDLE_VALUE; } Status = NtDuplicateObject(hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, lpTargetHandle, dwDesiredAccess, bInheritHandle ? OBJ_INHERIT : 0, dwOptions); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus (Status); return FALSE; } return TRUE; }
/* * @implemented */ BOOL WINAPI SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask) { NTSTATUS Status; Status = NtSetInformationProcess(hProcess, ProcessAffinityMask, (PVOID)&dwProcessAffinityMask, sizeof(DWORD)); if (!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return FALSE; } return TRUE; }
/* * @implemented */ HANDLE WINAPI CreateMemoryResourceNotification( MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType ) { UNICODE_STRING EventName; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE hEvent; NTSTATUS Status; switch(NotificationType) { case LowMemoryResourceNotification: RtlInitUnicodeString(&EventName, L"\\KernelObjects\\LowMemoryCondition"); break; case HighMemoryResourceNotification: RtlInitUnicodeString(&EventName, L"\\KernelObjects\\HighMemoryCondition"); break; default: SetLastError(ERROR_INVALID_PARAMETER); return NULL; } InitializeObjectAttributes(&ObjectAttributes, &EventName, 0, hBaseDir, NULL); Status = NtOpenEvent(&hEvent, EVENT_QUERY_STATE | SYNCHRONIZE, &ObjectAttributes); if(!NT_SUCCESS(Status)) { SetLastErrorByStatus(Status); return NULL; } return hEvent; }