[ros-dev] About GDIOBJHDR header changes

Timo Kreuzer timo.kreuzer at web.de
Mon Dec 31 04:55:18 CET 2007


Alex Ionescu wrote:
> Let's begin with the GDI Base Object, which is a header at the top of
> every GDI Object. The structure is called _BASEOBJECT (what you refer
> to as "GDIOBJHDR") and is defined as follows:
>
> struct _BASEOBJECT
> {
>     HANDLE hHmgr;
>     ULONG ulShareCount;
>     LONG cExclusiveLock;
>     ULONG BaseFlags;
>     PW32THREAD Tid;
> };
Your structure is 20 bytes long, I can say for sure that for all gdi
objects I have seen the header is 16 bytes. Maybe you mean
struct _BASEOBJECT
{
    HANDLE hHmgr;
    ULONG ulShareCount;
    USHORT cExclusiveLock;
    USHORT BaseFlags;
    PW32THREAD Tid;
};
This would match my findings with having 0x8000 in the BaseFlags field

>
> The pointer to a _BASEOBJECT is known as a POBJ.
>
> Now, how to get to this object? Well, dxg and win32k.sys now both
> implement different Hmhr's (Handle Managers).
>
> In Win32K land, the handles come from gpentHmgr, and each handle is
> indexed from it. The resulting structure is called an _ENTRY, and is
> defined as follows:
>
> struct _ENTRY
> {
>     union
>     {
>         POBJ pobj;
>         HANDLE hFree;
>     };
>     union
>     {
>          ULONG ulObj;
>          struct
>          {
>                 USHORT Count:15;
>                 USHORT Lock:1;
>                 HANDLE Pid;
>          };
>     } ObjectOwner;
>     USHORT FullUnique;
>     UCHAR Objt;
>     UCHAR Flags;
>     PVOID pUser;
> };
I remember a discussion about this some time ago, when I suggested
something similar to this one and you were the one who disagreed and now
you come up with this one ;-) (Everyone remember we have to deal with
endianess.)
I agree on most of it, but the second union: the structure consists of
16 bits + 32 bits.
Can you explain the fields of the second union please.

Regards,
Timo




More information about the Ros-dev mailing list