mirror of
https://github.com/reactos/reactos.git
synced 2024-07-31 00:28:56 +00:00
[KERNEL32][CONSRV]
Make kernel32 / winsrv console CSR structures Win2k3-compliant for CreateConsoleScreenBuffer. The aim is to be able to put our kernel32.dll or winsrv.dll on win2k3, and vice-versa. Because of that, we need to introduce and use the redundant hMutex and lpBitMap in the CONSOLE_CREATESCREENBUFFER structure, instead of the ones that are already present in its CONSOLE_GRAPHICS_BUFFER_INFO member ... Isn't MS dumb sometimes? I also homogeneize some variable names wrt. equivalent ones that I use elsewhere, and I fix a broken return value in the case the API fails. Part 3/X CORE-7931 svn path=/trunk/; revision=62846
This commit is contained in:
parent
0238322066
commit
38be5bceff
|
@ -1935,11 +1935,10 @@ CreateConsoleScreenBuffer(DWORD dwDesiredAccess,
|
||||||
DWORD dwFlags,
|
DWORD dwFlags,
|
||||||
LPVOID lpScreenBufferData)
|
LPVOID lpScreenBufferData)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
CONSOLE_API_MESSAGE ApiMessage;
|
CONSOLE_API_MESSAGE ApiMessage;
|
||||||
PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest = &ApiMessage.Data.CreateScreenBufferRequest;
|
PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest = &ApiMessage.Data.CreateScreenBufferRequest;
|
||||||
PCSR_CAPTURE_BUFFER CaptureBuffer = NULL;
|
PCSR_CAPTURE_BUFFER CaptureBuffer = NULL;
|
||||||
PCONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo = /*(PCONSOLE_GRAPHICS_BUFFER_INFO)*/lpScreenBufferData;
|
PCONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo = lpScreenBufferData;
|
||||||
|
|
||||||
if ( (dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE)) ||
|
if ( (dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE)) ||
|
||||||
(dwShareMode & ~(FILE_SHARE_READ | FILE_SHARE_WRITE)) ||
|
(dwShareMode & ~(FILE_SHARE_READ | FILE_SHARE_WRITE)) ||
|
||||||
|
@ -1949,15 +1948,16 @@ CreateConsoleScreenBuffer(DWORD dwDesiredAccess,
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateScreenBufferRequest->ScreenBufferType = dwFlags;
|
CreateScreenBufferRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
|
||||||
CreateScreenBufferRequest->Access = dwDesiredAccess;
|
CreateScreenBufferRequest->DesiredAccess = dwDesiredAccess;
|
||||||
CreateScreenBufferRequest->ShareMode = dwShareMode;
|
CreateScreenBufferRequest->InheritHandle =
|
||||||
CreateScreenBufferRequest->Inheritable =
|
|
||||||
(lpSecurityAttributes ? lpSecurityAttributes->bInheritHandle : FALSE);
|
(lpSecurityAttributes ? lpSecurityAttributes->bInheritHandle : FALSE);
|
||||||
|
CreateScreenBufferRequest->ShareMode = dwShareMode;
|
||||||
|
CreateScreenBufferRequest->ScreenBufferType = dwFlags;
|
||||||
|
|
||||||
if (dwFlags == CONSOLE_GRAPHICS_BUFFER)
|
if (dwFlags == CONSOLE_GRAPHICS_BUFFER)
|
||||||
{
|
{
|
||||||
if (CreateScreenBufferRequest->Inheritable || GraphicsBufferInfo == NULL)
|
if (CreateScreenBufferRequest->InheritHandle || GraphicsBufferInfo == NULL)
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
|
@ -1969,7 +1969,7 @@ CreateConsoleScreenBuffer(DWORD dwDesiredAccess,
|
||||||
if (CaptureBuffer == NULL)
|
if (CaptureBuffer == NULL)
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
return FALSE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
CsrCaptureMessageBuffer(CaptureBuffer,
|
CsrCaptureMessageBuffer(CaptureBuffer,
|
||||||
|
@ -1978,24 +1978,23 @@ CreateConsoleScreenBuffer(DWORD dwDesiredAccess,
|
||||||
(PVOID*)&CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMapInfo);
|
(PVOID*)&CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMapInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
|
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
|
||||||
CaptureBuffer,
|
CaptureBuffer,
|
||||||
CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepCreateScreenBuffer),
|
CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepCreateScreenBuffer),
|
||||||
sizeof(CONSOLE_CREATESCREENBUFFER));
|
sizeof(*CreateScreenBufferRequest));
|
||||||
|
|
||||||
if (CaptureBuffer)
|
if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer);
|
||||||
CsrFreeCaptureBuffer(CaptureBuffer);
|
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(ApiMessage.Status))
|
||||||
{
|
{
|
||||||
BaseSetLastNTError(Status);
|
BaseSetLastNTError(ApiMessage.Status);
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dwFlags == CONSOLE_GRAPHICS_BUFFER && GraphicsBufferInfo)
|
if (dwFlags == CONSOLE_GRAPHICS_BUFFER && GraphicsBufferInfo)
|
||||||
{
|
{
|
||||||
GraphicsBufferInfo->hMutex = CreateScreenBufferRequest->GraphicsBufferInfo.hMutex ;
|
GraphicsBufferInfo->hMutex = CreateScreenBufferRequest->hMutex ; // CreateScreenBufferRequest->GraphicsBufferInfo.hMutex ;
|
||||||
GraphicsBufferInfo->lpBitMap = CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap;
|
GraphicsBufferInfo->lpBitMap = CreateScreenBufferRequest->lpBitMap; // CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
return CreateScreenBufferRequest->OutputHandle;
|
return CreateScreenBufferRequest->OutputHandle;
|
||||||
|
|
|
@ -351,17 +351,19 @@ typedef struct
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
HANDLE OutputHandle; /* Handle to newly created screen buffer */
|
HANDLE ConsoleHandle;
|
||||||
|
DWORD DesiredAccess;
|
||||||
|
BOOL InheritHandle;
|
||||||
|
DWORD ShareMode;
|
||||||
DWORD ScreenBufferType; /* Type of the screen buffer: CONSOLE_TEXTMODE_BUFFER or CONSOLE_GRAPHICS_BUFFER */
|
DWORD ScreenBufferType; /* Type of the screen buffer: CONSOLE_TEXTMODE_BUFFER or CONSOLE_GRAPHICS_BUFFER */
|
||||||
/*
|
/*
|
||||||
* If we are creating a graphics screen buffer,
|
* This structure holds the initialization information
|
||||||
* this structure holds the initialization information.
|
* for graphics screen buffers.
|
||||||
*/
|
*/
|
||||||
CONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo;
|
CONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo;
|
||||||
|
HANDLE hMutex;
|
||||||
DWORD Access;
|
PVOID lpBitMap;
|
||||||
DWORD ShareMode;
|
HANDLE OutputHandle; /* Handle to newly created screen buffer */
|
||||||
BOOL Inheritable;
|
|
||||||
} CONSOLE_CREATESCREENBUFFER, *PCONSOLE_CREATESCREENBUFFER;
|
} CONSOLE_CREATESCREENBUFFER, *PCONSOLE_CREATESCREENBUFFER;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
|
@ -232,8 +232,8 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
/* Get infos from the graphics buffer information structure */
|
/* Get infos from the graphics buffer information structure */
|
||||||
if (!CsrValidateMessageBuffer(ApiMessage,
|
if (!CsrValidateMessageBuffer(ApiMessage,
|
||||||
(PVOID*)&CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMapInfo,
|
(PVOID*)&CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMapInfo,
|
||||||
1,
|
CreateScreenBufferRequest->GraphicsBufferInfo.dwBitMapInfoLength,
|
||||||
CreateScreenBufferRequest->GraphicsBufferInfo.dwBitMapInfoLength))
|
sizeof(BYTE)))
|
||||||
{
|
{
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
goto Quit;
|
goto Quit;
|
||||||
|
@ -242,11 +242,13 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
ScreenBufferInfo = &GraphicsInfo;
|
ScreenBufferInfo = &GraphicsInfo;
|
||||||
|
|
||||||
/* Initialize shared variables */
|
/* Initialize shared variables */
|
||||||
CreateScreenBufferRequest->GraphicsBufferInfo.hMutex = GraphicsInfo.Info.hMutex = INVALID_HANDLE_VALUE;
|
// CreateScreenBufferRequest->GraphicsBufferInfo.hMutex
|
||||||
CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap = GraphicsInfo.Info.lpBitMap = NULL;
|
CreateScreenBufferRequest->hMutex = GraphicsInfo.Info.hMutex = INVALID_HANDLE_VALUE;
|
||||||
|
// CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap
|
||||||
|
CreateScreenBufferRequest->lpBitMap = GraphicsInfo.Info.lpBitMap = NULL;
|
||||||
|
|
||||||
/* A graphics screen buffer is never inheritable */
|
/* A graphics screen buffer is never inheritable */
|
||||||
CreateScreenBufferRequest->Inheritable = FALSE;
|
CreateScreenBufferRequest->InheritHandle = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConDrvCreateScreenBuffer(&Buff,
|
Status = ConDrvCreateScreenBuffer(&Buff,
|
||||||
|
@ -261,8 +263,8 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
Status = ConSrvInsertObject(ProcessData,
|
Status = ConSrvInsertObject(ProcessData,
|
||||||
&CreateScreenBufferRequest->OutputHandle,
|
&CreateScreenBufferRequest->OutputHandle,
|
||||||
&Buff->Header,
|
&Buff->Header,
|
||||||
CreateScreenBufferRequest->Access,
|
CreateScreenBufferRequest->DesiredAccess,
|
||||||
CreateScreenBufferRequest->Inheritable,
|
CreateScreenBufferRequest->InheritHandle,
|
||||||
CreateScreenBufferRequest->ShareMode);
|
CreateScreenBufferRequest->ShareMode);
|
||||||
|
|
||||||
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
@ -276,8 +278,10 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
* Initialize the graphics buffer information structure
|
* Initialize the graphics buffer information structure
|
||||||
* and give it back to the client.
|
* and give it back to the client.
|
||||||
*/
|
*/
|
||||||
CreateScreenBufferRequest->GraphicsBufferInfo.hMutex = Buffer->ClientMutex;
|
// CreateScreenBufferRequest->GraphicsBufferInfo.hMutex
|
||||||
CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap = Buffer->ClientBitMap;
|
CreateScreenBufferRequest->hMutex = Buffer->ClientMutex;
|
||||||
|
// CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap
|
||||||
|
CreateScreenBufferRequest->lpBitMap = Buffer->ClientBitMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
Quit:
|
Quit:
|
||||||
|
|
Loading…
Reference in a new issue