Author: jgardou
Date: Thu Oct 23 19:41:42 2014
New Revision: 64938
URL:
http://svn.reactos.org/svn/reactos?rev=64938&view=rev
Log:
[WIN32K/USER32]
- Simplify an overcomplicated way to get buffer size from win32k
- Do not spaghettize between string length and buffer size.
- Properly use GetModuleFileName.
Modified:
trunk/reactos/win32ss/user/ntuser/cursoricon_new.c
trunk/reactos/win32ss/user/user32/windows/cursoricon_new.c
Modified: trunk/reactos/win32ss/user/ntuser/cursoricon_new.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/cursor…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/cursoricon_new.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/cursoricon_new.c [iso-8859-1] Thu Oct 23 19:41:42
2014
@@ -187,7 +187,8 @@
/* We just mark the handle as being destroyed.
* Deleting all the stuff will be deferred to the actual struct free. */
- return UserDeleteObject(CurIcon->head.h, TYPE_CURSOR);
+ UserDeleteObject(CurIcon->head.h, TYPE_CURSOR);
+ return TRUE;
}
void
@@ -357,16 +358,18 @@
/* Get the module name from the atom table */
_SEH2_TRY
{
- if (BufLen > (lpModule->MaximumLength * sizeof(WCHAR)))
+ BufLen += sizeof(WCHAR);
+ if (BufLen > (lpModule->MaximumLength))
{
lpModule->Length = 0;
+ lpModule->MaximumLength = BufLen;
}
else
{
ProbeForWrite(lpModule->Buffer, lpModule->MaximumLength, 1);
- BufLen = lpModule->MaximumLength * sizeof(WCHAR);
+ BufLen = lpModule->MaximumLength;
RtlQueryAtomInAtomTable(gAtomTable, CurIcon->atomModName, NULL, NULL,
lpModule->Buffer, &BufLen);
- lpModule->Length = BufLen/sizeof(WCHAR);
+ lpModule->Length = BufLen;
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
@@ -395,15 +398,18 @@
{
lpResName->Buffer = CurIcon->strName.Buffer;
lpResName->Length = 0;
+ lpResName->MaximumLength = 0;
}
- else if (lpResName->MaximumLength < CurIcon->strName.Length)
+ else if (lpResName->MaximumLength < CurIcon->strName.MaximumLength)
{
lpResName->Length = 0;
+ lpResName->MaximumLength = CurIcon->strName.MaximumLength;
}
else
{
- ProbeForWrite(lpResName->Buffer, lpResName->MaximumLength *
sizeof(WCHAR), 1);
- RtlCopyMemory(lpResName->Buffer, CurIcon->strName.Buffer,
lpResName->Length);
+ ProbeForWrite(lpResName->Buffer, lpResName->MaximumLength, 1);
+ RtlCopyMemory(lpResName->Buffer, CurIcon->strName.Buffer,
CurIcon->strName.Length);
+ lpResName->Length = CurIcon->strName.Length;
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
Modified: trunk/reactos/win32ss/user/user32/windows/cursoricon_new.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/window…
==============================================================================
--- trunk/reactos/win32ss/user/user32/windows/cursoricon_new.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/user32/windows/cursoricon_new.c [iso-8859-1] Thu Oct 23
19:41:42 2014
@@ -1342,27 +1342,37 @@
}
else
RtlInitUnicodeString(&ustrRsrc, lpszName);
-
- /* Prepare the module name string */
- ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, size*sizeof(WCHAR));
- /* Get it */
- do
- {
- DWORD ret = GetModuleFileNameW(hinst, ustrModule.Buffer, size);
+
+ /* Get the module name string */
+ while (TRUE)
+ {
+ DWORD ret;
+ ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, size*sizeof(WCHAR));
+ if (!ustrModule.Buffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return NULL;
+ }
+ ret = GetModuleFileNameW(hinst, ustrModule.Buffer, size);
if(ret == 0)
{
HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
return NULL;
}
- if(ret < size)
+
+ /* This API is completely broken... */
+ if (ret == size)
{
- ustrModule.Length = ret*sizeof(WCHAR);
- ustrModule.MaximumLength = size*sizeof(WCHAR);
- break;
+ HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
+ size *= 2;
+ continue;
}
- size *= 2;
- ustrModule.Buffer = HeapReAlloc(GetProcessHeap(), 0, ustrModule.Buffer,
size*sizeof(WCHAR));
- } while(TRUE);
+
+ ustrModule.Buffer[ret] = UNICODE_NULL;
+ ustrModule.Length = ret * sizeof(WCHAR);
+ ustrModule.MaximumLength = size * sizeof(WCHAR);
+ break;
+ }
/* Ask win32k */
param.bIcon = bIcon;
@@ -1691,75 +1701,51 @@
/* Get the icon module/resource names */
UNICODE_STRING ustrModule;
UNICODE_STRING ustrRsrc;
- PVOID pvBuf;
HMODULE hModule;
- ustrModule.MaximumLength = MAX_PATH * sizeof(WCHAR);
- ustrRsrc.MaximumLength = 256;
-
+ ustrModule.MaximumLength = 0;
+ ustrRsrc.MaximumLength = 0;
+
+ /* Get the buffer size */
+ if (!NtUserGetIconInfo(hicon, NULL, &ustrModule, &ustrRsrc, NULL,
FALSE))
+ {
+ return NULL;
+ }
+
ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, ustrModule.MaximumLength);
if (!ustrModule.Buffer)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return NULL;
}
- /* Keep track of the buffer for the resource, NtUserGetIconInfo might overwrite
it */
- pvBuf = HeapAlloc(GetProcessHeap(), 0, ustrRsrc.MaximumLength);
- if (!pvBuf)
- {
- HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return NULL;
- }
- ustrRsrc.Buffer = pvBuf;
-
- do
- {
- if (!NtUserGetIconInfo(hicon, NULL, &ustrModule, &ustrRsrc, NULL,
FALSE))
+
+ if (ustrRsrc.MaximumLength)
+ {
+ ustrRsrc.Buffer = HeapAlloc(GetProcessHeap(), 0, ustrRsrc.MaximumLength);
+ if (!ustrRsrc.Buffer)
{
HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
- HeapFree(GetProcessHeap(), 0, pvBuf);
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return NULL;
}
-
- if (ustrModule.Length && (ustrRsrc.Length ||
IS_INTRESOURCE(ustrRsrc.Buffer)))
- {
- /* Buffers were big enough */
- break;
- }
-
- /* Find which buffer were too small */
- if (!ustrModule.Length)
- {
- PWSTR newBuffer;
- ustrModule.MaximumLength *= 2;
- newBuffer = HeapReAlloc(GetProcessHeap(), 0, ustrModule.Buffer,
ustrModule.MaximumLength);
- if(!ustrModule.Buffer)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- goto leave;
- }
- ustrModule.Buffer = newBuffer;
- }
-
- if (!ustrRsrc.Length)
- {
- ustrRsrc.MaximumLength *= 2;
- pvBuf = HeapReAlloc(GetProcessHeap(), 0, ustrRsrc.Buffer,
ustrRsrc.MaximumLength);
- if (!pvBuf)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- goto leave;
- }
- ustrRsrc.Buffer = pvBuf;
- }
- } while(TRUE);
+ }
+
+ if (!NtUserGetIconInfo(hicon, NULL, &ustrModule, &ustrRsrc, NULL,
FALSE))
+ {
+ HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
+ if (!IS_INTRESOURCE(ustrRsrc.Buffer))
+ HeapFree(GetProcessHeap(), 0, ustrRsrc.Buffer);
+ return NULL;
+ }
/* NULL-terminate our strings */
- ustrModule.Buffer[ustrModule.Length/sizeof(WCHAR)] = 0;
+ ustrModule.Buffer[ustrModule.Length/sizeof(WCHAR)] = UNICODE_NULL;
if (!IS_INTRESOURCE(ustrRsrc.Buffer))
- ustrRsrc.Buffer[ustrRsrc.Length/sizeof(WCHAR)] = 0;
-
+ ustrRsrc.Buffer[ustrRsrc.Length/sizeof(WCHAR)] = UNICODE_NULL;
+
+ TRACE("Got module %S, resource %p (%S).\n", ustrModule.Buffer,
+ ustrRsrc.Buffer, IS_INTRESOURCE(ustrRsrc.Buffer) ? L"" :
ustrRsrc.Buffer);
+
/* Get the module handle */
if (!GetModuleHandleExW(0, ustrModule.Buffer, &hModule))
{
@@ -1783,7 +1769,8 @@
/* If we're here, that means that the passed icon is shared. Don't
destroy it, even if LR_COPYDELETEORG is specified */
leave:
HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
- HeapFree(GetProcessHeap(), 0, pvBuf);
+ if (!IS_INTRESOURCE(ustrRsrc.Buffer))
+ HeapFree(GetProcessHeap(), 0, ustrRsrc.Buffer);
TRACE("Returning 0x%08x.\n", ret);