}
INT STDCALL
-BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer)
+BITMAP_GetObject(BITMAPOBJ * bmp, INT Count, LPVOID buffer)
{
- if( !buffer ) return sizeof(BITMAP);
- if (count < sizeof(BITMAP)) return 0;
+ if( buffer == NULL ) return sizeof(BITMAP);
+ if (Count < sizeof(BITMAP)) return 0;
if(bmp->dib)
{
- if(count < (INT) sizeof(DIBSECTION))
+ if(Count < (INT) sizeof(DIBSECTION))
{
- if (count > (INT) sizeof(BITMAP)) count = sizeof(BITMAP);
+ if (Count > (INT) sizeof(BITMAP)) Count = sizeof(BITMAP);
}
else
{
- if (count > (INT) sizeof(DIBSECTION)) count = sizeof(DIBSECTION);
+ if (Count > (INT) sizeof(DIBSECTION)) Count = sizeof(DIBSECTION);
}
- memcpy(buffer, bmp->dib, count);
- return count;
+ memcpy(buffer, bmp->dib, Count);
+ return Count;
}
else
{
BITMAP Bitmap;
- if (count > (INT) sizeof(BITMAP)) count = sizeof(BITMAP);
+ if (Count > (INT) sizeof(BITMAP)) Count = sizeof(BITMAP);
Bitmap.bmType = 0;
Bitmap.bmWidth = bmp->SurfObj.sizlBitmap.cx;
Bitmap.bmHeight = bmp->SurfObj.sizlBitmap.cy;
Bitmap.bmBitsPixel = BitsPerFormat(bmp->SurfObj.iBitmapFormat);
//Bitmap.bmBits = bmp->SurfObj.pvBits;
Bitmap.bmBits = NULL; /* not set accoring wine test confirm in win2k */
- memcpy(buffer, &Bitmap, count);
- return count;
+ memcpy(buffer, &Bitmap, Count);
+ return Count;
}
}
/* EOF */
INT FASTCALL
BRUSH_GetObject (PGDIBRUSHOBJ BrushObject, INT Count, LPLOGBRUSH Buffer)
-{
- if (Buffer)
- {
-
- /* Set colour */
- Buffer->lbColor = BrushObject->BrushAttr.lbColor;
-
- /* set Hatch */
- if ((BrushObject->flAttrs & GDIBRUSH_IS_HATCH)!=0)
- {
- /* FIXME : is this right value */
- Buffer->lbHatch = (LONG)BrushObject->hbmPattern;
- }
- else
- {
- Buffer->lbHatch = 0;
- }
-
- Buffer->lbStyle = 0;
-
- /* Get the type of style */
- if ((BrushObject->flAttrs & GDIBRUSH_IS_SOLID)!=0)
- {
- Buffer->lbStyle = BS_SOLID;
- }
- else if ((BrushObject->flAttrs & GDIBRUSH_IS_NULL)!=0)
- {
- Buffer->lbStyle = BS_NULL; // BS_HOLLOW
- }
- else if ((BrushObject->flAttrs & GDIBRUSH_IS_HATCH)!=0)
- {
- Buffer->lbStyle = BS_HATCHED;
- }
- else if ((BrushObject->flAttrs & GDIBRUSH_IS_BITMAP)!=0)
- {
- Buffer->lbStyle = BS_PATTERN;
- }
- else if ((BrushObject->flAttrs & GDIBRUSH_IS_DIB)!=0)
- {
- Buffer->lbStyle = BS_DIBPATTERN;
- }
-
- /* FIXME
- else if ((BrushObject->flAttrs & )!=0)
- {
- Buffer->lbStyle = BS_INDEXED;
- }
-
- else if ((BrushObject->flAttrs & )!=0)
- {
- Buffer->lbStyle = BS_DIBPATTERNPT;
- }
- */
-
- }
- return sizeof(BRUSHOBJ);
+{
+ if( Buffer == NULL ) return sizeof(BRUSHOBJ);
+ if (Count < sizeof(BRUSHOBJ)) return 0;
+ if (Count > sizeof(BRUSHOBJ)) Count = sizeof(BRUSHOBJ);
+
+ /* Set colour */
+ Buffer->lbColor = BrushObject->BrushAttr.lbColor;
+
+ /* set Hatch */
+ if ((BrushObject->flAttrs & GDIBRUSH_IS_HATCH)!=0)
+ {
+ /* FIXME : is this right value */
+ Buffer->lbHatch = (LONG)BrushObject->hbmPattern;
+ }
+ else
+ {
+ Buffer->lbHatch = 0;
+ }
+
+ Buffer->lbStyle = 0;
+
+ /* Get the type of style */
+ if ((BrushObject->flAttrs & GDIBRUSH_IS_SOLID)!=0)
+ {
+ Buffer->lbStyle = BS_SOLID;
+ }
+ else if ((BrushObject->flAttrs & GDIBRUSH_IS_NULL)!=0)
+ {
+ Buffer->lbStyle = BS_NULL; // BS_HOLLOW
+ }
+ else if ((BrushObject->flAttrs & GDIBRUSH_IS_HATCH)!=0)
+ {
+ Buffer->lbStyle = BS_HATCHED;
+ }
+ else if ((BrushObject->flAttrs & GDIBRUSH_IS_BITMAP)!=0)
+ {
+ Buffer->lbStyle = BS_PATTERN;
+ }
+ else if ((BrushObject->flAttrs & GDIBRUSH_IS_DIB)!=0)
+ {
+ Buffer->lbStyle = BS_DIBPATTERN;
+ }
+
+ /* FIXME
+ else if ((BrushObject->flAttrs & )!=0)
+ {
+ Buffer->lbStyle = BS_INDEXED;
+ }
+ else if ((BrushObject->flAttrs & )!=0)
+ {
+ Buffer->lbStyle = BS_DIBPATTERNPT;
+ }
+ */
+
+ /* FIXME */
+ return sizeof(BRUSHOBJ);
}
INT STDCALL
NtGdiGetObject(HANDLE handle, INT count, LPVOID buffer)
{
- INT Ret;
+ INT Ret = 0;
LPVOID SafeBuf;
NTSTATUS Status = STATUS_SUCCESS;
+ INT RetCount = 0;
/* From Wine: GetObject does not SetLastError() on a null object */
- if (!handle) return 0;
+ if (!handle) return Ret;
- if (count <= 0)
+ RetCount = IntGdiGetObject(handle, 0, NULL);
+ if ((count <= 0) || (!buffer))
{
- return 0;
+ return RetCount;
}
_SEH_TRY
{
- ProbeForWrite(buffer,
- count,
- 1);
+ ProbeForWrite(buffer, count, 1);
}
_SEH_HANDLE
{
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
- return 0;
+ return Ret;
}
- SafeBuf = ExAllocatePoolWithTag(PagedPool, count, TAG_GDIOBJ);
- if(!SafeBuf)
+ if (RetCount >= count)
{
- SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
- return 0;
- }
+ SafeBuf = ExAllocatePoolWithTag(PagedPool, count, TAG_GDIOBJ);
+ if(!SafeBuf)
+ {
+ SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+ return Ret;
+ }
+ Ret = IntGdiGetObject(handle, count, SafeBuf);
- Ret = IntGdiGetObject(handle, count, SafeBuf);
+ _SEH_TRY
+ {
+ /* pointer already probed! */
+ RtlCopyMemory(buffer, SafeBuf, count);
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
- _SEH_TRY
- {
- /* pointer already probed! */
- RtlCopyMemory(buffer,
- SafeBuf,
- count);
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
+ ExFreePool(SafeBuf);
- ExFreePool(SafeBuf);
- if(!NT_SUCCESS(Status))
- {
- SetLastNtError(Status);
- return 0;
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ return 0;
+ }
}
return Ret;
LOGPEN LogPen;
+ if( Buffer == NULL ) return sizeof(LOGPEN);
+ if (Count < sizeof(LOGPEN)) return 0;
+ if (Count > sizeof(LOGPEN)) Count = sizeof(LOGPEN);
+
if( Buffer == NULL ) return sizeof(LOGPEN);
LogPen.lopnWidth = PenObject->ptPenWidth;
INT FASTCALL
FontGetObject(PTEXTOBJ Font, INT Count, PVOID Buffer)
{
- if (Buffer)
- {
- if (Count < sizeof(LOGFONTW))
- {
- SetLastWin32Error(ERROR_BUFFER_OVERFLOW);
- return 0;
- }
+ if( Buffer == NULL ) return sizeof(LOGFONTW);
- RtlCopyMemory(Buffer, &Font->logfont, sizeof(LOGFONTW));
- }
+ /* fixme SetLastWin32Error(ERROR_BUFFER_OVERFLOW); in count<0*/
+ if (Count < sizeof(LOGFONTW)) return 0;
+ if (Count > sizeof(LOGFONTW)) Count = sizeof(LOGFONTW);
+ RtlCopyMemory(Buffer, &Font->logfont, sizeof(LOGFONTW));
return sizeof(LOGFONTW);
}