static DWORD IntGetConsoleCommandHistory(LPVOID lpHistory, DWORD cbHistory, LPCVOID lpExeName, BOOLEAN bUnicode) { CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETCOMMANDHISTORY GetCommandHistoryRequest = &ApiMessage.Data.GetCommandHistoryRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); if (lpExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } GetCommandHistoryRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; GetCommandHistoryRequest->HistoryLength = cbHistory; GetCommandHistoryRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); GetCommandHistoryRequest->Unicode = GetCommandHistoryRequest->Unicode2 = bUnicode; // CaptureBuffer = CsrAllocateCaptureBuffer(2, IntStringSize(lpExeName, bUnicode) + // HistoryLength); CaptureBuffer = CsrAllocateCaptureBuffer(2, GetCommandHistoryRequest->ExeLength + GetCommandHistoryRequest->HistoryLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; } CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpExeName, GetCommandHistoryRequest->ExeLength, (PVOID)&GetCommandHistoryRequest->ExeName); CsrAllocateMessagePointer(CaptureBuffer, GetCommandHistoryRequest->HistoryLength, (PVOID*)&GetCommandHistoryRequest->History); CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCommandHistory), sizeof(*GetCommandHistoryRequest)); if (!NT_SUCCESS(ApiMessage.Status)) { CsrFreeCaptureBuffer(CaptureBuffer); BaseSetLastNTError(ApiMessage.Status); return 0; } RtlCopyMemory(lpHistory, GetCommandHistoryRequest->History, GetCommandHistoryRequest->HistoryLength); CsrFreeCaptureBuffer(CaptureBuffer); return GetCommandHistoryRequest->HistoryLength; }
static BOOL IntSetConsoleNumberOfCommands(DWORD dwNumCommands, LPCVOID lpExeName, BOOLEAN bUnicode) { CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_SETHISTORYNUMBERCOMMANDS SetHistoryNumberCommandsRequest = &ApiMessage.Data.SetHistoryNumberCommandsRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); if (lpExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } SetHistoryNumberCommandsRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; SetHistoryNumberCommandsRequest->NumCommands = dwNumCommands; SetHistoryNumberCommandsRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); SetHistoryNumberCommandsRequest->Unicode = SetHistoryNumberCommandsRequest->Unicode2 = bUnicode; // CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode)); CaptureBuffer = CsrAllocateCaptureBuffer(1, SetHistoryNumberCommandsRequest->ExeLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } // IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, // &SetHistoryNumberCommandsRequest->ExeName); CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpExeName, SetHistoryNumberCommandsRequest->ExeLength, (PVOID)&SetHistoryNumberCommandsRequest->ExeName); CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetNumberOfCommands), sizeof(*SetHistoryNumberCommandsRequest)); CsrFreeCaptureBuffer(CaptureBuffer); if (!NT_SUCCESS(ApiMessage.Status)) { BaseSetLastNTError(ApiMessage.Status); return FALSE; } return TRUE; }
/* * @implemented */ DWORD WINAPI GetConsoleAliasesLengthW(LPWSTR lpExeName) { NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest = &ApiMessage.Data.GetAllAliasesLengthRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; DPRINT("GetConsoleAliasesLengthW entered\n"); if (lpExeName == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } GetAllAliasesLengthRequest->ExeLength = (wcslen(lpExeName) + 1) * sizeof(WCHAR); GetAllAliasesLengthRequest->Length = 0; /* Allocate a Capture Buffer */ CaptureBuffer = CsrAllocateCaptureBuffer(1, GetAllAliasesLengthRequest->ExeLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; } /* Capture the exe name */ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpExeName, GetAllAliasesLengthRequest->ExeLength, (PVOID)&GetAllAliasesLengthRequest->ExeName); Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasesLength), sizeof(CONSOLE_GETALLALIASESLENGTH)); CsrFreeCaptureBuffer(CaptureBuffer); if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return 0; } return GetAllAliasesLengthRequest->Length; }
static VOID IntExpungeConsoleCommandHistory(LPCVOID lpExeName, BOOLEAN bUnicode) { CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_EXPUNGECOMMANDHISTORY ExpungeCommandHistoryRequest = &ApiMessage.Data.ExpungeCommandHistoryRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); if (lpExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return; } ExpungeCommandHistoryRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; ExpungeCommandHistoryRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); ExpungeCommandHistoryRequest->Unicode = ExpungeCommandHistoryRequest->Unicode2 = bUnicode; // CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode)); CaptureBuffer = CsrAllocateCaptureBuffer(1, ExpungeCommandHistoryRequest->ExeLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return; } // IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, // &ExpungeCommandHistoryRequest->ExeName); CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpExeName, ExpungeCommandHistoryRequest->ExeLength, (PVOID)&ExpungeCommandHistoryRequest->ExeName); CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepExpungeCommandHistory), sizeof(*ExpungeCommandHistoryRequest)); CsrFreeCaptureBuffer(CaptureBuffer); if (!NT_SUCCESS(ApiMessage.Status)) BaseSetLastNTError(ApiMessage.Status); }
/* Copy a string to a capture buffer */ static VOID IntCaptureMessageString(PCSR_CAPTURE_BUFFER CaptureBuffer, LPCVOID String, BOOL Unicode, PUNICODE_STRING RequestString) { ULONG Size; if (Unicode) { Size = wcslen(String) * sizeof(WCHAR); CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)String, Size, (PVOID *)&RequestString->Buffer); } else { Size = strlen(String); CsrAllocateMessagePointer(CaptureBuffer, Size * sizeof(WCHAR), (PVOID *)&RequestString->Buffer); Size = MultiByteToWideChar(CP_ACP, 0, String, Size, RequestString->Buffer, Size * sizeof(WCHAR)) * sizeof(WCHAR); } RequestString->Length = RequestString->MaximumLength = (USHORT)Size; }
/* * @implemented */ DWORD WINAPI GetConsoleAliasesW(LPWSTR AliasBuffer, DWORD AliasBufferLength, LPWSTR ExeName) { NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETALLALIASES GetAllAliasesRequest = &ApiMessage.Data.GetAllAliasesRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; DPRINT("GetConsoleAliasesW entered\n"); /* Determine the needed sizes */ GetAllAliasesRequest->ExeLength = GetConsoleAliasesLengthW(ExeName); if (GetAllAliasesRequest->ExeLength == 0 || GetAllAliasesRequest->ExeLength > AliasBufferLength) { return 0; } GetAllAliasesRequest->AliasesBufferLength = AliasBufferLength; /* Allocate a Capture Buffer */ CaptureBuffer = CsrAllocateCaptureBuffer(2, GetAllAliasesRequest->ExeLength + GetAllAliasesRequest->AliasesBufferLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; } /* Capture the exe name and allocate space for the aliases buffer */ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)ExeName, GetAllAliasesRequest->ExeLength, (PVOID*)&GetAllAliasesRequest->ExeName); CsrAllocateMessagePointer(CaptureBuffer, GetAllAliasesRequest->AliasesBufferLength, (PVOID*)&GetAllAliasesRequest->AliasesBuffer); Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliases), sizeof(CONSOLE_GETALLALIASES)); if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return 0; } /* Copy the returned aliases string into the user buffer */ // wcscpy(AliasBuffer, GetAllAliasesRequest->AliasesBuffer); memcpy(AliasBuffer, GetAllAliasesRequest->AliasesBuffer, GetAllAliasesRequest->AliasesBufferLength); /* Release the capture buffer and exit */ CsrFreeCaptureBuffer(CaptureBuffer); return GetAllAliasesRequest->AliasesBufferLength; // / sizeof(WCHAR); (original code) }
/* * @implemented */ BOOL WINAPI AddConsoleAliasW(LPCWSTR lpSource, LPCWSTR lpTarget, LPCWSTR lpExeName) { NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &ApiMessage.Data.ConsoleAliasRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; ULONG CapturedStrings; DPRINT("AddConsoleAliasW enterd with lpSource %S lpTarget %S lpExeName %S\n", lpSource, lpTarget, lpExeName); /* Determine the needed sizes */ ConsoleAliasRequest->SourceLength = (wcslen(lpSource ) + 1) * sizeof(WCHAR); ConsoleAliasRequest->ExeLength = (wcslen(lpExeName) + 1) * sizeof(WCHAR); CapturedStrings = 2; if (lpTarget) /* The target can be optional */ { ConsoleAliasRequest->TargetLength = (wcslen(lpTarget) + 1) * sizeof(WCHAR); CapturedStrings++; } else { ConsoleAliasRequest->TargetLength = 0; } /* Allocate a Capture Buffer */ CaptureBuffer = CsrAllocateCaptureBuffer(CapturedStrings, ConsoleAliasRequest->SourceLength + ConsoleAliasRequest->ExeLength + ConsoleAliasRequest->TargetLength); if (CaptureBuffer == NULL) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } /* Capture the strings */ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpSource, ConsoleAliasRequest->SourceLength, (PVOID*)&ConsoleAliasRequest->Source); CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpExeName, ConsoleAliasRequest->ExeLength, (PVOID*)&ConsoleAliasRequest->Exe); if (lpTarget) /* The target can be optional */ { CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpTarget, ConsoleAliasRequest->TargetLength, (PVOID*)&ConsoleAliasRequest->Target); } else { ConsoleAliasRequest->Target = NULL; } Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepAddAlias), sizeof(CONSOLE_ADDGETALIAS)); CsrFreeCaptureBuffer(CaptureBuffer); if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return FALSE; } return TRUE; }
/* * @implemented */ DWORD WINAPI GetConsoleAliasW(LPWSTR lpSource, LPWSTR lpTargetBuffer, DWORD TargetBufferLength, LPWSTR lpExeName) { NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &ApiMessage.Data.ConsoleAliasRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; DPRINT("GetConsoleAliasW entered with lpSource %S lpExeName %S\n", lpSource, lpExeName); if (lpTargetBuffer == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } /* Determine the needed sizes */ ConsoleAliasRequest->SourceLength = (wcslen(lpSource ) + 1) * sizeof(WCHAR); ConsoleAliasRequest->ExeLength = (wcslen(lpExeName) + 1) * sizeof(WCHAR); ConsoleAliasRequest->Target = NULL; ConsoleAliasRequest->TargetLength = TargetBufferLength; /* Allocate a Capture Buffer */ CaptureBuffer = CsrAllocateCaptureBuffer(3, ConsoleAliasRequest->SourceLength + ConsoleAliasRequest->ExeLength + ConsoleAliasRequest->TargetLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; } /* Capture the strings */ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpSource, ConsoleAliasRequest->SourceLength, (PVOID*)&ConsoleAliasRequest->Source); CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpExeName, ConsoleAliasRequest->ExeLength, (PVOID*)&ConsoleAliasRequest->Exe); /* Allocate space for the target buffer */ CsrAllocateMessagePointer(CaptureBuffer, ConsoleAliasRequest->TargetLength, (PVOID*)&ConsoleAliasRequest->Target); Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAlias), sizeof(CONSOLE_ADDGETALIAS)); if (!NT_SUCCESS(Status)) { CsrFreeCaptureBuffer(CaptureBuffer); BaseSetLastNTError(Status); return 0; } /* Copy the returned target string into the user buffer */ // wcscpy(lpTargetBuffer, ConsoleAliasRequest->Target); memcpy(lpTargetBuffer, ConsoleAliasRequest->Target, ConsoleAliasRequest->TargetLength); /* Release the capture buffer and exit */ CsrFreeCaptureBuffer(CaptureBuffer); return ConsoleAliasRequest->TargetLength; }
/* * @implemented */ BOOL WINAPI DefineDosDeviceW( DWORD dwFlags, LPCWSTR lpDeviceName, LPCWSTR lpTargetPath ) { ULONG ArgumentCount; ULONG BufferSize; BASE_API_MESSAGE ApiMessage; PBASE_DEFINE_DOS_DEVICE DefineDosDeviceRequest = &ApiMessage.Data.DefineDosDeviceRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; NTSTATUS Status; UNICODE_STRING NtTargetPathU; UNICODE_STRING DeviceNameU; UNICODE_STRING DeviceUpcaseNameU; HANDLE hUser32; DEV_BROADCAST_VOLUME dbcv; BOOL Result = TRUE; DWORD dwRecipients; typedef long (WINAPI *BSM_type)(DWORD,LPDWORD,UINT,WPARAM,LPARAM); BSM_type BSM_ptr; if ( (dwFlags & 0xFFFFFFF0) || ((dwFlags & DDD_EXACT_MATCH_ON_REMOVE) && ! (dwFlags & DDD_REMOVE_DEFINITION)) ) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } ArgumentCount = 1; BufferSize = 0; if (! lpTargetPath) { RtlInitUnicodeString(&NtTargetPathU, NULL); } else { if (dwFlags & DDD_RAW_TARGET_PATH) { RtlInitUnicodeString(&NtTargetPathU, lpTargetPath); } else { if (! RtlDosPathNameToNtPathName_U(lpTargetPath, &NtTargetPathU, 0, 0)) { WARN("RtlDosPathNameToNtPathName_U() failed\n"); BaseSetLastNTError(STATUS_OBJECT_NAME_INVALID); return FALSE; } } ArgumentCount = 2; BufferSize += NtTargetPathU.Length; } RtlInitUnicodeString(&DeviceNameU, lpDeviceName); RtlUpcaseUnicodeString(&DeviceUpcaseNameU, &DeviceNameU, TRUE); BufferSize += DeviceUpcaseNameU.Length; CaptureBuffer = CsrAllocateCaptureBuffer(ArgumentCount, BufferSize); if (! CaptureBuffer) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); Result = FALSE; } else { DefineDosDeviceRequest->Flags = dwFlags; CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)DeviceUpcaseNameU.Buffer, DeviceUpcaseNameU.Length, (PVOID*)&DefineDosDeviceRequest->DeviceName.Buffer); DefineDosDeviceRequest->DeviceName.Length = DeviceUpcaseNameU.Length; DefineDosDeviceRequest->DeviceName.MaximumLength = DeviceUpcaseNameU.Length; if (NtTargetPathU.Buffer) { CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)NtTargetPathU.Buffer, NtTargetPathU.Length, (PVOID*)&DefineDosDeviceRequest->TargetPath.Buffer); } DefineDosDeviceRequest->TargetPath.Length = NtTargetPathU.Length; DefineDosDeviceRequest->TargetPath.MaximumLength = NtTargetPathU.Length; Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepDefineDosDevice), sizeof(BASE_DEFINE_DOS_DEVICE)); CsrFreeCaptureBuffer(CaptureBuffer); if (!NT_SUCCESS(Status)) { WARN("CsrClientCallServer() failed (Status %lx)\n", Status); BaseSetLastNTError(Status); Result = FALSE; } else { if (! (dwFlags & DDD_NO_BROADCAST_SYSTEM) && DeviceUpcaseNameU.Length == 2 * sizeof(WCHAR) && DeviceUpcaseNameU.Buffer[1] == L':' && ( (DeviceUpcaseNameU.Buffer[0] - L'A') < 26 )) { hUser32 = LoadLibraryA("user32.dll"); if (hUser32) { BSM_ptr = (BSM_type) GetProcAddress(hUser32, "BroadcastSystemMessageW"); if (BSM_ptr) { dwRecipients = BSM_APPLICATIONS; dbcv.dbcv_size = sizeof(DEV_BROADCAST_VOLUME); dbcv.dbcv_devicetype = DBT_DEVTYP_VOLUME; dbcv.dbcv_reserved = 0; dbcv.dbcv_unitmask |= (1 << (DeviceUpcaseNameU.Buffer[0] - L'A')); dbcv.dbcv_flags = DBTF_NET; (void) BSM_ptr(BSF_SENDNOTIFYMESSAGE | BSF_FLUSHDISK, &dwRecipients, WM_DEVICECHANGE, (WPARAM)DBT_DEVICEARRIVAL, (LPARAM)&dbcv); } FreeLibrary(hUser32); } } } } if (NtTargetPathU.Buffer) { RtlFreeHeap(RtlGetProcessHeap(), 0, NtTargetPathU.Buffer); } RtlFreeUnicodeString(&DeviceUpcaseNameU); return Result; }
BOOL APIENTRY VDMConsoleOperation( DWORD iFunction, LPVOID lpData ) /*++ Parameters: iFunction - Function Index. VDM_HIDE_WINDOW Return Value: TRUE - The operation was successful. FALSE/NULL - The operation failed. Extended error status is available using GetLastError. --*/ { CONSOLE_API_MSG m; PCONSOLE_VDM_MSG a = &m.u.VDMConsoleOperation; LPRECT lpRect; LPPOINT lpPoint; PBOOL lpBool; PCSR_CAPTURE_HEADER CaptureBuffer = NULL; #if defined(FE_SB) #if defined(i386) LPVDM_IOCTL_PARAM lpIoctlParam; #endif #endif // FE_SB a->ConsoleHandle = GET_CONSOLE_HANDLE; a->iFunction = iFunction; if (iFunction == VDM_CLIENT_TO_SCREEN || iFunction == VDM_SCREEN_TO_CLIENT) { lpPoint = (LPPOINT)lpData; a->Point = *lpPoint; } else if (iFunction == VDM_FULLSCREEN_NOPAINT) { a->Bool = (lpData != NULL); } #if defined(FE_SB) else if (iFunction == VDM_SET_VIDEO_MODE) { a->Bool = (lpData != NULL); } #if defined(i386) else if (iFunction == VDM_SAVE_RESTORE_HW_STATE) { a->Bool = (lpData != NULL); } else if (iFunction == VDM_VIDEO_IOCTL) { lpIoctlParam = (LPVDM_IOCTL_PARAM)lpData; a->VDMIoctlParam = *lpIoctlParam; if (lpIoctlParam->lpvInBuffer != NULL) { if (lpIoctlParam->lpvOutBuffer != NULL || lpIoctlParam->cbInBuffer == 0) { SET_LAST_ERROR(ERROR_INVALID_PARAMETER); return FALSE; } CaptureBuffer = CsrAllocateCaptureBuffer( 1, lpIoctlParam->cbInBuffer ); if (CaptureBuffer == NULL) { SET_LAST_ERROR(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } CsrCaptureMessageBuffer( CaptureBuffer, (PCHAR) lpIoctlParam->lpvInBuffer, lpIoctlParam->cbInBuffer, (PVOID *) &a->VDMIoctlParam.lpvInBuffer ); } if (lpIoctlParam->lpvOutBuffer != NULL) { if (lpIoctlParam->cbOutBuffer == 0) { SET_LAST_ERROR(ERROR_INVALID_PARAMETER); return FALSE; } CaptureBuffer = CsrAllocateCaptureBuffer( 1, lpIoctlParam->cbOutBuffer ); if (CaptureBuffer == NULL) { SET_LAST_ERROR(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } CsrCaptureMessageBuffer( CaptureBuffer, (PCHAR) lpIoctlParam->lpvOutBuffer, lpIoctlParam->cbOutBuffer, (PVOID *) &a->VDMIoctlParam.lpvOutBuffer ); } } #endif // i386 #endif // FE_SB CsrClientCallServer( (PCSR_API_MSG)&m, CaptureBuffer, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepVDMOperation ), sizeof( *a ) ); if (NT_SUCCESS( m.ReturnValue )) { switch (iFunction) { case VDM_IS_ICONIC: case VDM_IS_HIDDEN: lpBool = (PBOOL)lpData; *lpBool = a->Bool; break; case VDM_CLIENT_RECT: lpRect = (LPRECT)lpData; *lpRect = a->Rect; break; case VDM_CLIENT_TO_SCREEN: case VDM_SCREEN_TO_CLIENT: *lpPoint = a->Point; break; #if defined(FE_SB) #if defined(i386) case VDM_VIDEO_IOCTL: if (lpIoctlParam->lpvOutBuffer != NULL) { try { RtlCopyMemory( lpIoctlParam->lpvOutBuffer, a->VDMIoctlParam.lpvOutBuffer, lpIoctlParam->cbOutBuffer ); } except( EXCEPTION_EXECUTE_HANDLER ) { CsrFreeCaptureBuffer( CaptureBuffer ); SET_LAST_ERROR(ERROR_INVALID_ACCESS); return FALSE; } } if (CaptureBuffer != NULL) { CsrFreeCaptureBuffer( CaptureBuffer ); } break; #endif // i386 #endif // FE_SB default: break; } return TRUE; } else { #if defined(FE_SB) #if defined(i386) if (CaptureBuffer != NULL) {
BOOL APIENTRY SetConsoleKeyShortcuts( IN BOOL bSet, IN BYTE bReserveKeys, IN LPAPPKEY lpAppKeys, IN DWORD dwNumAppKeys ) /*++ Description: Only one set of key shortcuts is valid per console. Calling SetConsoleKeyShortcuts(set) overwrites any previous settings. SetConsoleKeyShortcuts(!set) removes any shortcuts. Parameters: bSet - if TRUE, set shortcuts. else remove shortcuts. bReserveKeys - byte containing reserve key info. lpAppKeys - pointer to application-defined shortcut keys. can be null. dwNumAppKeys - number of app keys contained in lpAppKeys. Return value: TRUE - The operation was successful. FALSE/NULL - The operation failed. Extended error status is available using GetLastError. --*/ { CONSOLE_API_MSG m; PCONSOLE_SETKEYSHORTCUTS_MSG a = &m.u.SetConsoleKeyShortcuts; PCSR_CAPTURE_HEADER CaptureBuffer; a->ConsoleHandle = GET_CONSOLE_HANDLE; a->Set = bSet; a->ReserveKeys = bReserveKeys; if (lpAppKeys == NULL) { a->NumAppKeys = 0; CaptureBuffer = NULL; } else { a->NumAppKeys = dwNumAppKeys; CaptureBuffer = CsrAllocateCaptureBuffer( 1, dwNumAppKeys * sizeof(APPKEY) ); if (CaptureBuffer == NULL) { SET_LAST_ERROR(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } CsrCaptureMessageBuffer( CaptureBuffer, lpAppKeys, dwNumAppKeys * sizeof(APPKEY), (PVOID *) &a->AppKeys ); } CsrClientCallServer( (PCSR_API_MSG)&m, CaptureBuffer, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepSetKeyShortcuts ), sizeof( *a ) ); if (CaptureBuffer) CsrFreeCaptureBuffer( CaptureBuffer ); if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { return TRUE; } }
BOOL APIENTRY RegisterConsoleVDM( IN DWORD dwRegisterFlags, IN HANDLE hStartHardwareEvent, IN HANDLE hEndHardwareEvent, IN LPWSTR lpStateSectionName, IN DWORD dwStateSectionNameLength, OUT LPDWORD lpStateLength, OUT PVOID *lpState, IN LPWSTR lpVDMBufferSectionName, IN DWORD dwVDMBufferSectionNameLength, IN COORD VDMBufferSize OPTIONAL, OUT PVOID *lpVDMBuffer ) /*++ Description: This routine registers the VDM with the console. Parameters: hStartHardwareEvent - the event the VDM waits on to be notified of gaining/losing control of the hardware. hEndHardwareEvent - the event the VDM sets when it is done saving/restoring the hardware. Return value: TRUE - The operation was successful. FALSE/NULL - The operation failed. Extended error status is available using GetLastError. --*/ { CONSOLE_API_MSG m; PCONSOLE_REGISTERVDM_MSG a = &m.u.RegisterConsoleVDM; PCSR_CAPTURE_HEADER CaptureBuffer; a->ConsoleHandle = GET_CONSOLE_HANDLE; a->RegisterFlags = dwRegisterFlags; if (dwRegisterFlags) { a->StartEvent = hStartHardwareEvent; a->EndEvent = hEndHardwareEvent; a->VDMBufferSectionNameLength = dwVDMBufferSectionNameLength; a->VDMBufferSize = VDMBufferSize; a->StateSectionNameLength = dwStateSectionNameLength; CaptureBuffer = CsrAllocateCaptureBuffer( 2, dwStateSectionNameLength+dwVDMBufferSectionNameLength ); if (CaptureBuffer == NULL) { SET_LAST_ERROR(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } CsrCaptureMessageBuffer( CaptureBuffer, lpStateSectionName, dwStateSectionNameLength, (PVOID *) &a->StateSectionName ); CsrCaptureMessageBuffer( CaptureBuffer, lpVDMBufferSectionName, dwVDMBufferSectionNameLength, (PVOID *) &a->VDMBufferSectionName ); } else { CaptureBuffer = NULL; } CsrClientCallServer( (PCSR_API_MSG)&m, CaptureBuffer, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepRegisterVDM ), sizeof( *a ) ); if (CaptureBuffer != NULL) { CsrFreeCaptureBuffer( CaptureBuffer ); } if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { if (dwRegisterFlags) { try { *lpStateLength = a->StateLength; *lpState = a->StateBuffer; *lpVDMBuffer = a->VDMBuffer; } except (EXCEPTION_EXECUTE_HANDLER) { SET_LAST_ERROR(ERROR_INVALID_ACCESS); return FALSE; } } return TRUE; } }