DWORD dwCount = 0;
HWND* pHwnd = NULL;
HANDLE hHeap;
+ NTSTATUS Status;
- SetLastError(0);
+ Status = NtUserBuildHwndList ( NULL, hWndparent, FALSE, 0, 0, NULL, &dwCount );
- dwCount = NtUserBuildHwndList ( NULL, hWndparent, FALSE, 0, 0, NULL, 0 );
-
- if ( !dwCount || GetLastError() )
+ if ( !NT_SUCCESS( Status ) )
return 0;
/* allocate buffer to receive HWND handles */
}
/* now call kernel again to fill the buffer this time */
- dwCount = NtUserBuildHwndList (NULL, hWndparent, FALSE, 0, 0, pHwnd, dwCount );
+ Status = NtUserBuildHwndList (NULL, hWndparent, FALSE, 0, 0, pHwnd, &dwCount );
- if ( !dwCount || GetLastError() )
+ if ( !NT_SUCCESS( Status ) )
{
if ( pHwnd )
- HeapFree ( hHeap, 0, pHwnd );
+ HeapFree ( hHeap, 0, pHwnd );
return 0;
}
DWORD i, dwCount = 0;
HWND* pHwnd = NULL;
HANDLE hHeap;
+ NTSTATUS Status;
if ( !lpfn )
{
sort of persistent buffer and only grow it ( requiring a 2nd
call ) when the buffer wasn't already big enough? */
/* first get how many window entries there are */
- dwCount = NtUserBuildHwndList (
- hDesktop, hWndparent, bChildren, dwThreadId, lParam, NULL, 0 );
- if ( !dwCount )
+ Status = NtUserBuildHwndList (
+ hDesktop, hWndparent, bChildren, dwThreadId, lParam, NULL, &dwCount );
+ if ( !NT_SUCCESS( Status ) )
return FALSE;
/* allocate buffer to receive HWND handles */
}
/* now call kernel again to fill the buffer this time */
- dwCount = NtUserBuildHwndList (
- hDesktop, hWndparent, bChildren, dwThreadId, lParam, pHwnd, dwCount );
- if ( !dwCount )
+ Status = NtUserBuildHwndList (
+ hDesktop, hWndparent, bChildren, dwThreadId, lParam, pHwnd, &dwCount );
+ if ( !NT_SUCCESS( Status ) )
{
if ( pHwnd )
HeapFree ( hHeap, 0, pHwnd );
NtUserBlockInput(
BOOL BlockIt);
-ULONG
+NTSTATUS
NTAPI
NtUserBuildHwndList(
HDESK hDesktop,
ULONG dwThreadId,
ULONG lParam,
HWND* pWnd,
- ULONG nBufSize);
+ ULONG* nBufSize);
NTSTATUS NTAPI
NtUserBuildNameList(
/*
* @implemented
*/
-ULONG
+NTSTATUS
STDCALL
NtUserBuildHwndList(
HDESK hDesktop,
ULONG dwThreadId,
ULONG lParam,
HWND* pWnd,
- ULONG nBufSize)
+ ULONG* pBufSize)
{
NTSTATUS Status;
ULONG dwCount = 0;
+ if (pBufSize == 0)
+ return ERROR_INVALID_PARAMETER;
+
if (hwndParent || !dwThreadId)
{
PDESKTOP_OBJECT Desktop;
{
if(hDesktop == NULL && !(Desktop = IntGetActiveDesktop()))
{
- SetLastWin32Error(ERROR_INVALID_HANDLE);
- return 0;
+ return ERROR_INVALID_HANDLE;
}
if(hDesktop)
&Desktop);
if(!NT_SUCCESS(Status))
{
- SetLastWin32Error(ERROR_INVALID_HANDLE);
- return 0;
+ return ERROR_INVALID_HANDLE;
}
}
hwndParent = Desktop->DesktopWindow;
{
if (bGoDown)
{
- if(dwCount++ < nBufSize && pWnd)
+ if(dwCount++ < *pBufSize && pWnd)
{
_SEH_TRY
{
Status = PsLookupThreadByThreadId((HANDLE)dwThreadId, &Thread);
if(!NT_SUCCESS(Status))
{
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- return 0;
+ return ERROR_INVALID_PARAMETER;
}
if(!(W32Thread = (PW32THREAD)Thread->Tcb.Win32Thread))
{
ObDereferenceObject(Thread);
DPRINT("Thread is not a GUI Thread!\n");
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- return 0;
+ return ERROR_INVALID_PARAMETER;
}
Current = W32Thread->WindowListHead.Flink;
if(bChildren || Window->hOwner != NULL)
{
- if(dwCount < nBufSize && pWnd)
+ if(dwCount < *pBufSize && pWnd)
{
Status = MmCopyToCaller(pWnd++, &Window->hSelf, sizeof(HWND));
if(!NT_SUCCESS(Status))
ObDereferenceObject(Thread);
}
- return dwCount;
+ *pBufSize = dwCount;
+ return STATUS_SUCCESS;
}