From: Keith Marshall Date: Wed, 2 Nov 2022 14:46:12 +0000 (+0000) Subject: Clean up interlocked memory access API declarations. X-Git-Url: http://git.osdn.net/view?p=mingw%2Fmingw-org-wsl.git;a=commitdiff_plain;h=e6a7d2485cad66c3daaf9c91e8b4d87c9210b2e0 Clean up interlocked memory access API declarations. --- diff --git a/w32api/ChangeLog b/w32api/ChangeLog index 27392d7..12ac32c 100644 --- a/w32api/ChangeLog +++ b/w32api/ChangeLog @@ -1,3 +1,70 @@ +2022-11-02 Keith Marshall + + Clean up interlocked memory access API declarations. + + * include/ddk/ntddk.h [_DDK_NTDDK_H]: Always defined, implying... + [__USE_NTOSKRNL__]: ...this, never defined elsewhere, and always true + when defined here; hence, macro is redundant; delete its definition, + together with its enclosing (redundant) repeat definition guard. + + * include/winbase.h include/ddk/winddk.h + [__USE_NTOSKRNL__, __INTERLOCKED_DECLARED]: Delete references. + (InterlockedDecrement, InterlockedIncrement, InterlockedExchange) + (InterlockedCompareExchange, InterlockedCompareExchangePointer) + (InterlockedExchangePointer, InterlockedExchangeAdd): Factor out; + relocate declarations, and implementations as appropriate, to... + * include/winnt.h: ...here, per Microsoft's current documentation. + (__kernel_api): New local macro; define it conditionally... + [_DDK_NTDDK_H defined]: ...to match DDKFASTAPI usage, else... + [_DDK_NTDDK_H ! defined]: ...to match WINAPI usage. + + * include/winbase.h (InterlockedPushEntrySList) + (InterlockedPopEntrySlist): Declare them, only if... + [_DDK_WINDDK_H ! defined]: ...not previously declared... + * include/ddk/winddk.h: ...thence. + + * include/winnt.h (_WIN32_INTRINSIC): New macro; define, and... + (InterlockedCompareExchangePointer, InterlockedExchangePointer): + ...use it. + + * include/ddk/winddk.h (InterlockedPushEntrySList) + (InterlockedPopEntrySlist): Declare them, only if... + [_WINBASE_H ! defined]: ...not previously declared... + * include/winbase.h: ...thence. + + * include/ddk/winddk.h (FILE_LIST_DIRECTORY, FILE_READ_DATA) + (FILE_ADD_FILE, FILE_WRITE_DATA, FILE_ADD_SUBDIRECTORY) + (FILE_APPEND_DATA, FILE_CREATE_PIPE_INSTANCE, FILE_READ_EA) + (FILE_WRITE_EA, FILE_EXECUTE, FILE_TRAVERSE, FILE_DELETE_CHILD) + (FILE_READ_ATTRIBUTES, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ) + (FILE_SHARE_WRITE, FILE_SHARE_DELETE, FILE_SHARE_VALID_FLAGS) + (FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_HIDDEN) + (FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_DIRECTORY) + (FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_DEVICE, FILE_ATTRIBUTE_NORMAL) + (FILE_ATTRIBUTE_TEMPORARY, FILE_ATTRIBUTE_SPARSE_FILE) + (FILE_ATTRIBUTE_REPARSE_POINT, FILE_ATTRIBUTE_COMPRESSED) + (FILE_ATTRIBUTE_OFFLINE, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) + (FILE_ATTRIBUTE_ENCRYPTED, FILE_ATTRIBUTE_VIRTUAL) + (FILE_ATTRIBUTE_VALID_FLAGS, FILE_ATTRIBUTE_VALID_SET_FLAGS) + (FILE_COPY_STRUCTURED_STORAGE, FILE_STRUCTURED_STORAGE) + (FILE_VALID_OPTION_FLAGS, FILE_VALID_PIPE_OPTION_FLAGS) + (FILE_VALID_MAILSLOT_OPTION_FLAGS, FILE_VALID_SET_FLAGS) + (FILE_SUPERSEDE, FILE_OPEN, FILE_CREATE, FILE_OPEN_IF, FILE_OVERWRITE) + (FILE_OVERWRITE_IF, FILE_MAXIMUM_DISPOSITION, FILE_DIRECTORY_FILE) + (FILE_WRITE_THROUGH, FILE_SEQUENTIAL_ONLY) + (FILE_NO_INTERMEDIATE_BUFFERING, FILE_SYNCHRONOUS_IO_ALERT) + (FILE_SYNCHRONOUS_IO_NONALERT, FILE_NON_DIRECTORY_FILE) + (FILE_CREATE_TREE_CONNECTION, FILE_COMPLETE_IF_OPLOCKED) + (FILE_NO_EA_KNOWLEDGE, FILE_OPEN_FOR_RECOVERY, FILE_RANDOM_ACCESS) + (FILE_DELETE_ON_CLOSE, FILE_OPEN_BY_FILE_ID) + (FILE_OPEN_FOR_BACKUP_INTENT, FILE_NO_COMPRESSION) + (FILE_RESERVE_OPFILTER, FILE_OPEN_REPARSE_POINT, FILE_OPEN_NO_RECALL) + (FILE_OPEN_FOR_FREE_SPACE_QUERY, FILE_ALL_ACCESS) + (FILE_GENERIC_EXECUTE, FILE_GENERIC_READ, FILE_GENERIC_WRITE) + (DUPLICATE_CLOSE_SOURCE, DUPLICATE_SAME_ACCESS) + (DUPLICATE_SAME_ATTRIBUTES): Delete redundant definitions; all are... + * include/winnt.h: ...already defined thence. + 2022-10-15 Keith Marshall Do not define public symbols in diff --git a/w32api/include/ddk/ntddk.h b/w32api/include/ddk/ntddk.h index 6deacb1..dcf4c7b 100644 --- a/w32api/include/ddk/ntddk.h +++ b/w32api/include/ddk/ntddk.h @@ -5,7 +5,6 @@ * DBG - Debugging enabled/disabled (0/1) * POOL_TAGGING - Enable pool tagging * _X86_ - X86 environment - * __USE_NTOSKRNL__ - Use ntoskrnl.exe instead of kernel32.dll * * $Id$ * @@ -34,12 +33,8 @@ * */ #ifndef _DDK_NTDDK_H -#define _DDK_NTDDK_H #pragma GCC system_header - -#ifndef __USE_NTOSKRNL__ -#define __USE_NTOSKRNL__ 1 -#endif +#define _DDK_NTDDK_H #include #include diff --git a/w32api/include/ddk/winddk.h b/w32api/include/ddk/winddk.h index c5e16a9..6719b6b 100644 --- a/w32api/include/ddk/winddk.h +++ b/w32api/include/ddk/winddk.h @@ -360,100 +360,6 @@ typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX; #define FILE_EXISTS 0x00000004 #define FILE_DOES_NOT_EXIST 0x00000005 -#if 1 -/* FIXME: also in winnt.h; hence, already defined? - */ -#define FILE_LIST_DIRECTORY 0x00000001 -#define FILE_READ_DATA 0x00000001 -#define FILE_ADD_FILE 0x00000002 -#define FILE_WRITE_DATA 0x00000002 -#define FILE_ADD_SUBDIRECTORY 0x00000004 -#define FILE_APPEND_DATA 0x00000004 -#define FILE_CREATE_PIPE_INSTANCE 0x00000004 -#define FILE_READ_EA 0x00000008 -#define FILE_WRITE_EA 0x00000010 -#define FILE_EXECUTE 0x00000020 -#define FILE_TRAVERSE 0x00000020 -#define FILE_DELETE_CHILD 0x00000040 -#define FILE_READ_ATTRIBUTES 0x00000080 -#define FILE_WRITE_ATTRIBUTES 0x00000100 - -#define FILE_SHARE_READ 0x00000001 -#define FILE_SHARE_WRITE 0x00000002 -#define FILE_SHARE_DELETE 0x00000004 -#define FILE_SHARE_VALID_FLAGS 0x00000007 - -#define FILE_ATTRIBUTE_READONLY 0x00000001 -#define FILE_ATTRIBUTE_HIDDEN 0x00000002 -#define FILE_ATTRIBUTE_SYSTEM 0x00000004 -#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 -#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 -#define FILE_ATTRIBUTE_DEVICE 0x00000040 -#define FILE_ATTRIBUTE_NORMAL 0x00000080 -#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 -#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 -#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 -#define FILE_ATTRIBUTE_COMPRESSED 0x00000800 -#define FILE_ATTRIBUTE_OFFLINE 0x00001000 -#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 -#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 -#define FILE_ATTRIBUTE_VIRTUAL 0x00010000 - -#define FILE_ATTRIBUTE_VALID_FLAGS 0x00017fb7 -#define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7 - -#define FILE_COPY_STRUCTURED_STORAGE 0x00000041 -#define FILE_STRUCTURED_STORAGE 0x00000441 - -#define FILE_VALID_OPTION_FLAGS 0x00ffffff -#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032 -#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 -#define FILE_VALID_SET_FLAGS 0x00000036 - -#define FILE_SUPERSEDE 0x00000000 -#define FILE_OPEN 0x00000001 -#define FILE_CREATE 0x00000002 -#define FILE_OPEN_IF 0x00000003 -#define FILE_OVERWRITE 0x00000004 -#define FILE_OVERWRITE_IF 0x00000005 -#define FILE_MAXIMUM_DISPOSITION 0x00000005 - -#define FILE_DIRECTORY_FILE 0x00000001 -#define FILE_WRITE_THROUGH 0x00000002 -#define FILE_SEQUENTIAL_ONLY 0x00000004 -#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 -#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 -#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 -#define FILE_NON_DIRECTORY_FILE 0x00000040 -#define FILE_CREATE_TREE_CONNECTION 0x00000080 -#define FILE_COMPLETE_IF_OPLOCKED 0x00000100 -#define FILE_NO_EA_KNOWLEDGE 0x00000200 -#define FILE_OPEN_FOR_RECOVERY 0x00000400 -#define FILE_RANDOM_ACCESS 0x00000800 -#define FILE_DELETE_ON_CLOSE 0x00001000 -#define FILE_OPEN_BY_FILE_ID 0x00002000 -#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 -#define FILE_NO_COMPRESSION 0x00008000 -#define FILE_RESERVE_OPFILTER 0x00100000 -#define FILE_OPEN_REPARSE_POINT 0x00200000 -#define FILE_OPEN_NO_RECALL 0x00400000 -#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 - -#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) - -#define FILE_GENERIC_EXECUTE \ - (STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE) - -#define FILE_GENERIC_READ \ - (STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES \ - | FILE_READ_EA | SYNCHRONIZE) - -#define FILE_GENERIC_WRITE \ - (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES \ - | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE) - -#endif /* winnt.h */ - #define DIRECTORY_QUERY (0x0001) #define DIRECTORY_TRAVERSE (0x0002) #define DIRECTORY_CREATE_OBJECT (0x0004) @@ -946,15 +852,6 @@ typedef VOID DDKAPI #define SYMBOLIC_LINK_QUERY 0x0001 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) -#if 1 -/* FIXME: also in winnt.h; hence already defined? - */ -#define DUPLICATE_CLOSE_SOURCE 0x00000001 -#define DUPLICATE_SAME_ACCESS 0x00000002 -#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 - -#endif /* winnt.h */ - typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; @@ -4062,56 +3959,38 @@ KeGetCurrentIrql( VOID ); ((ULONG)KeGetCurrentKPCR()->Number) -#if __USE_NTOSKRNL__ -/* CAREFUL: These are exported from ntoskrnl.exe as __fastcall functions, - but are also exported from kernel32.dll and declared in winbase.h as - __stdcall */ -#if !defined(__INTERLOCKED_DECLARED) -#define __INTERLOCKED_DECLARED - -NTOSAPI LONG DDKFASTAPI -InterlockedIncrement( /*IN*/ LONG VOLATILE *Addend ); - -NTOSAPI LONG DDKFASTAPI -InterlockedDecrement( /*IN*/ LONG VOLATILE *Addend ); - -NTOSAPI LONG DDKFASTAPI -InterlockedCompareExchange( - /*IN OUT*/ PLONG VOLATILE Destination, - /*IN*/ LONG Exchange, - /*IN*/ LONG Comparand -); - -NTOSAPI LONG DDKFASTAPI -InterlockedExchange( - /*IN OUT*/ PLONG VOLATILE Target, - /*IN*/ LONG Value -); - -NTOSAPI LONG DDKFASTAPI -InterlockedExchangeAdd( - /*IN OUT*/ PLONG VOLATILE Addend, - /*IN*/ LONG Value -); - -/* PVOID - * InterlockedExchangePointer( - * IN OUT PVOID VOLATILE *Target, - * IN PVOID Value) +/* Formerly declared here, on the assumption that we are building + * a Windows device driver, and thus exported by ntoskrnl.exe, with + * __fastcall calling convention, (as opposed to exports of the same + * functions from kernel32.dll, whence the __stdcall convention is + * applicable), the following: + * + * long InterlockedDecrement (long volatile *); + * long InterlockedIncrement (long volatile *); + * + * long InterlockedExchange (long volatile *, long); + * long InterlockedCompareExchange (long volatile *, long, long); + * long InterlockedExchangeAdd (long volatile *, long); + * + * together with intrinsic implementations of: + * + * void *InterlockedCompareExchangePointer (void *volatile *, void *, void *); + * void *InterlockedExchangePointer (void *volatile *, void *); + * + * are now declared in , which is guaranteed to have been + * included already, with logic to determine the appropriate calling + * convention; thus, we may simply adopt the appropriately qualified + * declarations, without repetition here. + * + * Similarly, (but without the guarantee of prior inclusion), + * introduced by WinXP... */ -#define InterlockedExchangePointer(Target, Value) \ - ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value)) - -/* PVOID InterlockedCompareExchangePointer( - * IN OUT PVOID *Destination, - * IN PVOID Exchange, - * IN PVOID Comparand - * ) +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) && ! defined _WINBASE_H +/* ...the following MAY have been declared already, if + * has been included before we get to here; if it has, we simply adopt + * its declarations, but if it has not, we provide declarations here, + * (assuming use of the __fastcall exports from ntoskrnl.exe). */ -#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \ - ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand)) - -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) PSLIST_ENTRY DDKFASTAPI InterlockedPopEntrySList( /*IN*/ PSLIST_HEADER ListHead ); @@ -4120,10 +3999,7 @@ InterlockedPushEntrySList( /*IN*/ PSLIST_HEADER ListHead, /*IN*/ PSLIST_ENTRY ListEntry ); -#endif /* _WIN32_WINNT >= _WIN32_WINNT_WINXP */ - -#endif /* !__INTERLOCKED_DECLARED */ -#endif /* __USE_NTOSKRNL__ */ +#endif /* (_WIN32_WINNT >= _WIN32_WINNT_WINXP) && !_WINBASE_H */ NTOSAPI VOID DDKFASTAPI KefAcquireSpinLockAtDpcLevel( /*IN*/ PKSPIN_LOCK SpinLock ); @@ -4138,7 +4014,7 @@ KefReleaseSpinLockFromDpcLevel( /*IN*/ PKSPIN_LOCK SpinLock ); #define KeGetDcacheFillSize() 1L -#endif /* _X86_ */ +#endif /* _X86_ */ /* Utility functions */ @@ -4218,7 +4094,7 @@ RtlAssert( #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp) #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp) -#else /* !DBG */ +#else /* !DBG */ #define ASSERT(exp) ((VOID) 0) #define ASSERTMSG(msg, exp) ((VOID) 0) @@ -4232,7 +4108,7 @@ RtlAssert( #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE) #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) -#endif /* DBG */ +#endif /* DBG */ /* Driver support routines @@ -5072,13 +4948,13 @@ ExInterlockedPushEntrySList( /*IN*/ PKSPIN_LOCK Lock ); -#if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= _WIN32_WINNT_WINXP) +#if _WIN32_WINNT >= _WIN32_WINNT_WINXP #define ExInterlockedPopEntrySList(_ListHead, _Lock) \ InterlockedPopEntrySList(_ListHead) #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \ InterlockedPushEntrySList(_ListHead, _ListEntry) -#endif /* __USE_NTOSKRNL__ */ +#endif /* _WIN32_WINNT >= _WIN32_WINNT_WINXP */ #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead) @@ -5113,7 +4989,7 @@ ExFreeToNPagedLookasideList( } } -#if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= _WIN32_WINNT_WINXP) +#if _WIN32_WINNT >= _WIN32_WINNT_WINXP static __inline__ PVOID ExAllocateFromPagedLookasideList( @@ -5145,7 +5021,7 @@ ExFreeToPagedLookasideList( } } -#else /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= _WIN32_WINNT_WINXP) */ +#else /* _WIN32_WINNT >= _WIN32_WINNT_WINXP */ NTOSAPI PVOID DDKAPI ExAllocateFromPagedLookasideList( /*IN*/ PPAGED_LOOKASIDE_LIST Lookaside ); @@ -5156,7 +5032,7 @@ ExFreeToPagedLookasideList( /*IN*/ PVOID Entry ); -#endif /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= _WIN32_WINNT_WINXP) */ +#endif /* _WIN32_WINNT >= _WIN32_WINNT_WINXP */ NTOSAPI PVOID DDKAPI ExAllocatePoolWithQuotaTag( @@ -5177,7 +5053,7 @@ ExAllocatePoolWithTag( #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD') #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD') -#else /* !POOL_TAGGING */ +#else /* !POOL_TAGGING */ NTOSAPI PVOID DDKAPI ExAllocatePool( /*IN*/ POOL_TYPE PoolType, /*IN*/ SIZE_T NumberOfBytes ); @@ -5185,7 +5061,7 @@ ExAllocatePool( /*IN*/ POOL_TYPE PoolType, /*IN*/ SIZE_T NumberOfBytes ); NTOSAPI PVOID DDKAPI ExAllocatePoolWithQuota( /*IN*/ POOL_TYPE PoolType, /*IN*/ SIZE_T NumberOfBytes ); -#endif /* POOL_TAGGING */ +#endif /* POOL_TAGGING */ NTOSAPI PVOID DDKAPI ExAllocatePoolWithTagPriority( @@ -8328,14 +8204,14 @@ DbgSetDebugFilterState( #define KdBreakPoint() DbgBreakPoint() #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s) -#else /* !DBG */ +#else /* !DBG */ #define KdPrint(_x_) #define KdPrintEx(_x_) #define KdBreakPoint() #define KdBreakPointWithStatus(s) -#endif /* !DBG */ +#endif /* !DBG */ extern NTOSAPI PBOOLEAN KdDebuggerNotPresent; extern NTOSAPI PBOOLEAN KdDebuggerEnabled; diff --git a/w32api/include/winbase.h b/w32api/include/winbase.h index 52f1f95..fb96c7e 100644 --- a/w32api/include/winbase.h +++ b/w32api/include/winbase.h @@ -2099,41 +2099,52 @@ WINBASEAPI BOOL WINAPI InitializeSecurityDescriptor (PSECURITY_DESCRIPTOR, DWORD); WINBASEAPI BOOL WINAPI InitializeSid (PSID, PSID_IDENTIFIER_AUTHORITY, BYTE); -#if !(__USE_NTOSKRNL__) -/* CAREFUL: These are exported from ntoskrnl.exe and declared in winddk.h - as __fastcall functions, but are exported from kernel32.dll as __stdcall */ -#if (_WIN32_WINNT >= 0x0501) +/* Formerly declared here, but now documented by Microsoft as being + * declared in , (which has been automatically included by + * the time we get here), declarations of the following interlocked + * memory access functions: + * + * long InterlockedDecrement (long volatile *); + * long InterlockedIncrement (long volatile *); + * + * long InterlockedExchange (long volatile *, long); + * long InterlockedCompareExchange (long volatile *, long, long); + * long InterlockedExchangeAdd (long volatile *, long); + * + * together with the associated intrinsic implementations of: + * + * void *InterlockedCompareExchangePointer (void *volatile *, void *, void *); + * void *InterlockedExchangePointer (void *volatile *, void *); + * + * have been relocated accordingly. + */ +#if _WIN32_WINNT >= _WIN32_WINNT_WINXP +/* FIXME: Microsoft's current documentation says that the following + * should be declared in , (which MinGW.OSDN doesn't + * provide at present); leave them here for the time being, but maybe + * consider a future relocation. + */ WINBASEAPI VOID WINAPI InitializeSListHead (PSLIST_HEADER); -#endif +WINBASEAPI PSLIST_ENTRY WINAPI InterlockedFlushSList (PSLIST_HEADER); -#ifndef __INTERLOCKED_DECLARED -/* FIXME: Is this another invitation for inconsistent definition? - * Where else is this declared? +#ifndef _DDK_WINDDK_H +/* + * ** CAUTION ** + * + * This pair is exported by both ntoskrnl.exe and kernel32.exe, but with + * incompatible calling conventions; intent to link with ntoskrnl.exe may + * have been indicated already, by prior inclusion of , in + * which case these will have been declared already, with the appropriate + * __fastcall semantics, but if not, declare them here, with the choice + * between __stdcall and __fastcall determined appropriately by prior + * definition of __kernel_api, inherited from , (which has + * been included previously). */ -#define __INTERLOCKED_DECLARED -LONG WINAPI InterlockedCompareExchange (LONG volatile *, LONG, LONG); -/* PVOID WINAPI InterlockedCompareExchangePointer (PVOID *, PVOID, PVOID); */ -#define InterlockedCompareExchangePointer(d, e, c) \ - (PVOID)InterlockedCompareExchange((LONG volatile *)(d),(LONG)(e),(LONG)(c)) -LONG WINAPI InterlockedDecrement (LONG volatile *); -LONG WINAPI InterlockedExchange (LONG volatile *, LONG); -/* PVOID WINAPI InterlockedExchangePointer (PVOID *, PVOID); */ -#define InterlockedExchangePointer(t, v) \ - (PVOID)InterlockedExchange((LONG volatile *)(t),(LONG)(v)) -LONG WINAPI InterlockedExchangeAdd (LONG volatile *, LONG); - -#if (_WIN32_WINNT >= 0x0501) -PSLIST_ENTRY WINAPI InterlockedFlushSList (PSLIST_HEADER); -#endif - -LONG WINAPI InterlockedIncrement (LONG volatile *); +PSLIST_ENTRY __kernel_api InterlockedPushEntrySList (PSLIST_HEADER, PSLIST_ENTRY); +PSLIST_ENTRY __kernel_api InterlockedPopEntrySList (PSLIST_HEADER); -#if (_WIN32_WINNT >= 0x0501) -PSLIST_ENTRY WINAPI InterlockedPopEntrySList (PSLIST_HEADER); -PSLIST_ENTRY WINAPI InterlockedPushEntrySList (PSLIST_HEADER, PSLIST_ENTRY); -#endif -#endif /* __INTERLOCKED_DECLARED */ -#endif /* __USE_NTOSKRNL__ */ +#endif /* !_DDK_WINDDK_H */ +#endif /* _WIN32_WINNT >= _WIN32_WINNT_WINXP */ WINBASEAPI BOOL WINAPI IsBadCodePtr (FARPROC); WINBASEAPI BOOL WINAPI IsBadHugeReadPtr (PCVOID, UINT); diff --git a/w32api/include/winnt.h b/w32api/include/winnt.h index b982a2c..b2a64de 100644 --- a/w32api/include/winnt.h +++ b/w32api/include/winnt.h @@ -4333,6 +4333,58 @@ static FORCEINLINE void MemoryBarrier (void) #undef __mingw_thread_fence #undef __mingw_fence_insn__ +#ifndef _DDK_NTDDK_H +/* Several of the interlocked memory access API functions, which are + * declared below, are exported by both kernel32.dll, and ntoskrnl.exe, + * but with different (incompatible) calling conventions in each case. + * + * In the case where _DDK_NTDDL_H is NOT defined, it is assumed that + * the intent is to link with kernel32.dll, and the __stdcall calling + * convention is applicable... + */ +#define __kernel_api __stdcall +#else +/* ...whereas, when the _DDK_NTDDK_H guard IS defined, (as it will + * be when has been included beforehand), it is assumed + * that the intent is to build a Windows device driver, which will be + * linked with ntoskrnl.exe, and the __fastcall calling convention + * becomes applicable. + */ +#define __kernel_api __fastcall +#endif +/* Formerly declared within , and relocated here, to + * conform with Microsoft's current documentation, the following, + * conforming to the __stdcall calling convention, are exported by + * kernel32.dll; alternative implementations of each, but conforming + * to the __fastcall calling convention, are exported by ntoskrnl.exe, + * so these are declared with the appropriate __kernel_api calling + * convention, as determined immediately above. + */ +LONG __kernel_api InterlockedDecrement (LONG volatile *); +LONG __kernel_api InterlockedIncrement (LONG volatile *); + +LONG __kernel_api InterlockedExchange (LONG volatile *, LONG); +LONG __kernel_api InterlockedCompareExchange (LONG volatile *, LONG, LONG); +LONG __kernel_api InterlockedExchangeAdd (LONG volatile *, LONG); + +/* The interlocked pointer exchange functions are ALWAYS implemented + * as intrinsics, in terms of corresponding long int exchange functions. + */ +#define _WIN32_INTRINSIC extern __inline__ __attribute__((gnu_inline)) + +_WIN32_INTRINSIC +PVOID InterlockedCompareExchangePointer (PVOID volatile *D, PVOID X, PVOID C) +{ return (PVOID)( + InterlockedCompareExchange ((LONG volatile *)(D), (LONG)(X), (LONG)(C)) + ); +} +_WIN32_INTRINSIC +PVOID InterlockedExchangePointer (PVOID volatile *D, PVOID X) +{ return (PVOID)( + InterlockedExchange ((LONG volatile *)(D), (LONG)(X)) + ); +} + _END_C_DECLS #endif /* ! RC_INVOKED */