mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 22:52:54 +00:00
[USER32]
- In MsgiUnicodeToAnsiMessage, use a single contiguous buffer for CREATESTRUCTA and its strings. This allows applications to modify the structure without ill effects - Don't return the address of a stack structure in MsgiAnsiToUnicodeMessage CORE-8777 #resolve svn path=/trunk/; revision=66449
This commit is contained in:
parent
ee88b1c9f3
commit
6160cfa603
1 changed files with 36 additions and 24 deletions
|
@ -578,10 +578,10 @@ MsgiAnsiToUnicodeMessage(HWND hwnd, LPMSG UnicodeMsg, LPMSG AnsiMsg)
|
||||||
case WM_NCCREATE:
|
case WM_NCCREATE:
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
{
|
{
|
||||||
MDICREATESTRUCTW mdi_cs;
|
|
||||||
struct s
|
struct s
|
||||||
{
|
{
|
||||||
CREATESTRUCTW cs; /* new structure */
|
CREATESTRUCTW cs; /* new structure */
|
||||||
|
MDICREATESTRUCTW mdi_cs; /* MDI info */
|
||||||
LPCWSTR lpszName; /* allocated Name */
|
LPCWSTR lpszName; /* allocated Name */
|
||||||
LPCWSTR lpszClass; /* allocated Class */
|
LPCWSTR lpszClass; /* allocated Class */
|
||||||
};
|
};
|
||||||
|
@ -605,10 +605,10 @@ MsgiAnsiToUnicodeMessage(HWND hwnd, LPMSG UnicodeMsg, LPMSG AnsiMsg)
|
||||||
|
|
||||||
if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
|
if (GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_MDICHILD)
|
||||||
{
|
{
|
||||||
mdi_cs = *(MDICREATESTRUCTW *)xs->cs.lpCreateParams;
|
xs->mdi_cs = *(MDICREATESTRUCTW *)xs->cs.lpCreateParams;
|
||||||
mdi_cs.szTitle = xs->cs.lpszName;
|
xs->mdi_cs.szTitle = xs->cs.lpszName;
|
||||||
mdi_cs.szClass = xs->cs.lpszClass;
|
xs->mdi_cs.szClass = xs->cs.lpszClass;
|
||||||
xs->cs.lpCreateParams = &mdi_cs;
|
xs->cs.lpCreateParams = &xs->mdi_cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnicodeMsg->lParam = (LPARAM)xs;
|
UnicodeMsg->lParam = (LPARAM)xs;
|
||||||
|
@ -738,6 +738,7 @@ MsgiAnsiToUnicodeCleanup(LPMSG UnicodeMsg, LPMSG AnsiMsg)
|
||||||
struct s
|
struct s
|
||||||
{
|
{
|
||||||
CREATESTRUCTW cs; /* new structure */
|
CREATESTRUCTW cs; /* new structure */
|
||||||
|
MDICREATESTRUCTW mdi_cs; /* MDI info */
|
||||||
LPWSTR lpszName; /* allocated Name */
|
LPWSTR lpszName; /* allocated Name */
|
||||||
LPWSTR lpszClass; /* allocated Class */
|
LPWSTR lpszClass; /* allocated Class */
|
||||||
};
|
};
|
||||||
|
@ -847,10 +848,28 @@ MsgiUnicodeToAnsiMessage(HWND hwnd, LPMSG AnsiMsg, LPMSG UnicodeMsg)
|
||||||
MDICREATESTRUCTA *pmdi_cs;
|
MDICREATESTRUCTA *pmdi_cs;
|
||||||
CREATESTRUCTA* CsA;
|
CREATESTRUCTA* CsA;
|
||||||
CREATESTRUCTW* CsW;
|
CREATESTRUCTW* CsW;
|
||||||
|
ULONG NameSize, ClassSize;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
CsW = (CREATESTRUCTW*)(UnicodeMsg->lParam);
|
CsW = (CREATESTRUCTW*)(UnicodeMsg->lParam);
|
||||||
CsA = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(CREATESTRUCTA) + sizeof(MDICREATESTRUCTA));
|
RtlInitUnicodeString(&UnicodeString, CsW->lpszName);
|
||||||
|
NameSize = RtlUnicodeStringToAnsiSize(&UnicodeString);
|
||||||
|
if (NameSize == 0)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
ClassSize = 0;
|
||||||
|
if (!IS_ATOM(CsW->lpszClass))
|
||||||
|
{
|
||||||
|
RtlInitUnicodeString(&UnicodeString, CsW->lpszClass);
|
||||||
|
ClassSize = RtlUnicodeStringToAnsiSize(&UnicodeString);
|
||||||
|
if (ClassSize == 0)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CsA = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(CREATESTRUCTA) + sizeof(MDICREATESTRUCTA) + NameSize + ClassSize);
|
||||||
if (NULL == CsA)
|
if (NULL == CsA)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -861,21 +880,21 @@ MsgiUnicodeToAnsiMessage(HWND hwnd, LPMSG AnsiMsg, LPMSG UnicodeMsg)
|
||||||
pmdi_cs = (MDICREATESTRUCTA*)(CsA + 1);
|
pmdi_cs = (MDICREATESTRUCTA*)(CsA + 1);
|
||||||
|
|
||||||
RtlInitUnicodeString(&UnicodeString, CsW->lpszName);
|
RtlInitUnicodeString(&UnicodeString, CsW->lpszName);
|
||||||
Status = RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, TRUE);
|
RtlInitEmptyAnsiString(&AnsiString, (PCHAR)(pmdi_cs + 1), NameSize);
|
||||||
|
Status = RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, FALSE);
|
||||||
if (! NT_SUCCESS(Status))
|
if (! NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
RtlFreeHeap(GetProcessHeap(), 0, CsA);
|
RtlFreeHeap(GetProcessHeap(), 0, CsA);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
CsA->lpszName = AnsiString.Buffer;
|
CsA->lpszName = AnsiString.Buffer;
|
||||||
if (HIWORD((ULONG_PTR)CsW->lpszClass) != 0)
|
if (!IS_ATOM(CsW->lpszClass))
|
||||||
{
|
{
|
||||||
RtlInitUnicodeString(&UnicodeString, CsW->lpszClass);
|
RtlInitUnicodeString(&UnicodeString, CsW->lpszClass);
|
||||||
Status = RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, TRUE);
|
RtlInitEmptyAnsiString(&AnsiString, (PCHAR)(pmdi_cs + 1) + NameSize, ClassSize);
|
||||||
|
Status = RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, FALSE);
|
||||||
if (! NT_SUCCESS(Status))
|
if (! NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
RtlInitAnsiString(&AnsiString, CsA->lpszName);
|
|
||||||
RtlFreeAnsiString(&AnsiString);
|
|
||||||
RtlFreeHeap(GetProcessHeap(), 0, CsA);
|
RtlFreeHeap(GetProcessHeap(), 0, CsA);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -1118,13 +1137,6 @@ MsgiUnicodeToAnsiCleanup(LPMSG AnsiMsg, LPMSG UnicodeMsg)
|
||||||
CREATESTRUCTA* Cs;
|
CREATESTRUCTA* Cs;
|
||||||
|
|
||||||
Cs = (CREATESTRUCTA*) AnsiMsg->lParam;
|
Cs = (CREATESTRUCTA*) AnsiMsg->lParam;
|
||||||
RtlInitAnsiString(&AnsiString, Cs->lpszName);
|
|
||||||
RtlFreeAnsiString(&AnsiString);
|
|
||||||
if (HIWORD((ULONG_PTR)Cs->lpszClass) != 0)
|
|
||||||
{
|
|
||||||
RtlInitAnsiString(&AnsiString, Cs->lpszClass);
|
|
||||||
RtlFreeAnsiString(&AnsiString);
|
|
||||||
}
|
|
||||||
RtlFreeHeap(GetProcessHeap(), 0, Cs);
|
RtlFreeHeap(GetProcessHeap(), 0, Cs);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue