ProbeForReadUnicodeString should at least probe the buffers, otherwise
the function is pointless. I believe at one point it did, and it was
probably removed for some strange reason. The reason it copies the
UNICODE_STRING is so that the pointers can't be modified anymore.
Thomas
Timo Kreuzer wrote:
  SEH is still needed. SafeText doesn't really
deserve it's name, as it's
 only a safe copy of the UNICODE_STRING structure  returned by
 ProbeForReadUnicodeString(), but with the still unsafe string buffer.
 Also the Buffer was never probed (ProbeForReadUnicodeString only checks
 the UNICODE_STRING and copies it)
 IMO the function is dangerous, as it implies that the Buffer was probed,
 too.
 Timo
 jimtabor(a)svn.reactos.org schrieb:
  Author: jimtabor
 Date: Fri Jan  2 22:02:54 2009
 New Revision: 38518
 URL: 
http://svn.reactos.org/svn/reactos?rev=38518&view=rev
 Log:
 - Removed SEH abuse and add notes for the hook code, in NtUserDefSetText.
 - Update NtUserCallHwndLock subfunctions.
 Modified:
     trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c
     trunk/reactos/subsystems/win32/win32k/ntuser/window.c
      
 ...
  Modified:
trunk/reactos/subsystems/win32/win32k/ntuser/window.c
 URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
 ==============================================================================
 --- trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] (original)
 +++ trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] Fri Jan  2
22:02:54 2009
 @@ -4569,57 +4569,47 @@
     }
     Wnd = Window->Wnd;
 -   if(SafeText.Length != 0)
 -   {
 -      _SEH2_TRY
 -      {
 -          if (Wnd->WindowName.MaximumLength > 0 &&
 -              SafeText.Length <= Wnd->WindowName.MaximumLength -
sizeof(UNICODE_NULL))
 -          {
 -              ASSERT(Wnd->WindowName.Buffer != NULL);
 -
 -              Wnd->WindowName.Length = SafeText.Length;
 -              Wnd->WindowName.Buffer[SafeText.Length / sizeof(WCHAR)] =
L'\0';
 -              RtlCopyMemory(Wnd->WindowName.Buffer,
 -                            SafeText.Buffer,
 -                            SafeText.Length);
 -          }
 -          else
 -          {
 -              PWCHAR buf;
 -              Wnd->WindowName.MaximumLength = Wnd->WindowName.Length = 0;
 -              buf = Wnd->WindowName.Buffer;
 -              Wnd->WindowName.Buffer = NULL;
 -              if (buf != NULL)
 -              {
 -                  DesktopHeapFree(Wnd->pdesktop,
 -                                  buf);
 -              }
 -
 -              Wnd->WindowName.Buffer = DesktopHeapAlloc(Wnd->pdesktop,
 -                                                        SafeText.Length +
sizeof(UNICODE_NULL));
 -              if (Wnd->WindowName.Buffer != NULL)
 -              {
 -                  Wnd->WindowName.Buffer[SafeText.Length / sizeof(WCHAR)] =
L'\0';
 -                  RtlCopyMemory(Wnd->WindowName.Buffer,
 -                                SafeText.Buffer,
 -                                SafeText.Length);
 -                  Wnd->WindowName.MaximumLength = SafeText.Length +
sizeof(UNICODE_NULL);
 -                  Wnd->WindowName.Length = SafeText.Length;
 -              }
 -              else
 -              {
 -                  SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
 -                  Ret = FALSE;
 -              }
 -          }
 -      }
 -      _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
 -      {
 -           SetLastNtError(_SEH2_GetExceptionCode());
 -           Ret = FALSE;
 -      }
 -      _SEH2_END;
 +   if (SafeText.Length != 0)
 +   {
 +      if (Wnd->WindowName.MaximumLength > 0 &&
 +          SafeText.Length <= Wnd->WindowName.MaximumLength - sizeof(UNICODE_NULL))
 +      {
 +         ASSERT(Wnd->WindowName.Buffer != NULL);
 +
 +         Wnd->WindowName.Length = SafeText.Length;
 +         Wnd->WindowName.Buffer[SafeText.Length / sizeof(WCHAR)] = L'\0';
 +         RtlCopyMemory(Wnd->WindowName.Buffer,
 +                              SafeText.Buffer,
 +                              SafeText.Length);
 +      }
 +      else
 +      {
 +         PWCHAR buf;
 +         Wnd->WindowName.MaximumLength = Wnd->WindowName.Length = 0;
 +         buf = Wnd->WindowName.Buffer;
 +         Wnd->WindowName.Buffer = NULL;
 +         if (buf != NULL)
 +         {
 +            DesktopHeapFree(Wnd->pdesktop, buf);
 +         }
 +
 +         Wnd->WindowName.Buffer = DesktopHeapAlloc(Wnd->pdesktop,
 +                                                   SafeText.Length +
sizeof(UNICODE_NULL));
 +         if (Wnd->WindowName.Buffer != NULL)
 +         {
 +            Wnd->WindowName.Buffer[SafeText.Length / sizeof(WCHAR)] = L'\0';
 +            RtlCopyMemory(Wnd->WindowName.Buffer,
 +                                 SafeText.Buffer,
 +                                 SafeText.Length);
 +            Wnd->WindowName.MaximumLength = SafeText.Length + sizeof(UNICODE_NULL);
 +            Wnd->WindowName.Length = SafeText.Length;
 +         }
 +         else
 +         {
 +            SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
 +            Ret = FALSE;
 +         }
 +      }
     }
     else
     {
 @@ -4628,6 +4618,9 @@
            Wnd->WindowName.Buffer[0] = L'\0';
     }
 +   // HAX! FIXME! Windows does not do this in here!
 +   // In User32, these are called after: NotifyWinEvent EVENT_OBJECT_NAMECHANGE than
 +   // RepaintButton, StaticRepaint, NtUserCallHwndLock
HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK, etc.
     /* Send shell notifications */
     if (!IntGetOwner(Window) && !IntGetParent(Window))
     {
      
 _______________________________________________
 Ros-dev mailing list
 Ros-dev(a)reactos.org
 
http://www.reactos.org/mailman/listinfo/ros-dev