James Tabor schrieb:

Gdi and User point to the ClientInfo area which is part of thread info
structures and like all thread structures should be place in some sort
of include/reactos/win32k/w32thread.h. This would allow Gdi and User
to access them both. I have placed #ifndef _NTUSRTYP_ so when both
headers are used there will be no compile errors.
  
Placing an undocumented and partly unknown structure inside two different headers will lead to problems, like the two different versions we have now ;-)
 Suggestions:
 - when ms puts ntgdi.h into the sdk, we could also put ntuser.h there.
 - if we want to stay 100% compatible with sdk headers, we can add a
 define, like
 #ifdef USE_NON_SDK
 // put non sdk compatible but still windows compatible definitions here
 #endif
    
If we are compatible why do we need this? All SDK headers should be
compatible and I have pointed this out. When NDK/DDK (WDK) or PSDK
(SDK) changes are made the developer should have access to these and
compare the changes to verify them as correct. I have made changes to
the NDK with some Rtl functions and I had to make logical choices and
assumptions. Since those Rtl functions are unknown and the research
was from Wine, I did go through the steps of verifying and cross
referencing them before I moved them into NDK.

SDK and WDK are open to the public and there is nothing preventing
that developer from referencing them for research and standards.
  
Well I'm not sure if I got you right, so I just try to make my thinking more clear:
There's compatible and there's compatible:
A) our sdk headers will contain 100% the same as ms sdk headers, not less, not more
B) our sdk headers will contain everything that is in ms sdk headers, but can contain more.
The ms sdk you can download is the public sdk. It's probably not what ms uses to compile their stuff. It's partly limited. ntgdi.h contains "typedef struct _POLYPATBLT  POLYPATBLT, * PPOLYPATBLT";
But where's the real structure definition? Somewhere else? Does that make sense? Well it does when ms uses different headers that contain all the complete types, but then they don't even need this typedef.. So where do we put it?
I suggested the #ifdef's to have compatibility A when it's not defined and B when it's defined.
ntuser.h doesn't belong to the ms sdk. But for what reason? Do ms people really have ntuser stuff somewhere else? Probably not, they just decided not to ship it (I think they shipped ntuser.h with DDK some time ago)

Timo