source: trunk/src/NTDLL/ntdll.h@ 5655

Last change on this file since 5655 was 5568, checked in by sandervl, 24 years ago

merge with latest wine (rtlstr.c)

File size: 16.0 KB
Line 
1/* $Id: ntdll.h,v 1.13 2001-04-22 10:38:59 sandervl Exp $ */
2
3/*
4 this file defines interfaces mainly exposed to device drivers and
5 native nt dll's
6
7*/
8#ifndef __WINE_NTDDK_H
9#define __WINE_NTDDK_H
10
11#include <os2win.h>
12#include <misc.h>
13
14#include <ntdef.h>
15#include <winnt.h>
16#include "winbase.h" /* fixme: should be taken out sometimes */
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22
23/* Win32 register functions */
24// @@@PH what does GCC with this ?
25#define REGS_FUNC(name) __regs_##name
26
27
28/****************************************************************************
29 * adjust WINE header to ODIN *
30 ****************************************************************************/
31
32#ifdef NTAPI
33# undef NTAPI
34#endif
35#define NTAPI WIN32API
36
37#ifdef WINAPI
38# undef WINAPI
39#endif
40#define WINAPI WIN32API
41
42#ifndef BOOLEAN
43# define BOOLEAN BOOL
44#endif
45
46
47//SvL: Internal heap allocation definitions for NTDLL
48extern HANDLE NTDLL_hHeap;
49#define Heap_Alloc(a) HeapAlloc(NTDLL_hHeap, HEAP_ZERO_MEMORY, a)
50#define Heap_Free(a) HeapFree(NTDLL_hHeap, 0, (PVOID)a)
51
52typedef struct _IO_STATUS_BLOCK
53{ union
54 { NTSTATUS Status;
55 PVOID Pointer;
56 } u;
57 ULONG_PTR Information;
58} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
59
60// @@@PH - this seems to be wrong in WINE
61// typedef VOID (NTAPI* PIO_APC_ROUTINE) ( PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved );
62typedef PVOID PIO_APC_ROUTINE;
63
64typedef enum _KEY_INFORMATION_CLASS {
65 KeyBasicInformation,
66 KeyNodeInformation,
67 KeyFullInformation
68} KEY_INFORMATION_CLASS;
69
70typedef enum _KEY_VALUE_INFORMATION_CLASS {
71 KeyValueBasicInformation,
72 KeyValueFullInformation,
73 KeyValuePartialInformation,
74 KeyValueFullInformationAlign64,
75 KeyValuePartialInformationAlign64
76} KEY_VALUE_INFORMATION_CLASS;
77
78typedef enum _THREADINFOCLASS
79{ ThreadBasicInformation,
80 ThreadTimes,
81 ThreadPriority,
82 ThreadBasePriority,
83 ThreadAffinityMask,
84 ThreadImpersonationToken,
85 ThreadDescriptorTableEntry,
86 ThreadEnableAlignmentFaultFixup,
87 ThreadEventPair_Reusable,
88 ThreadQuerySetWin32StartAddress,
89 ThreadZeroTlsCell,
90 ThreadPerformanceCount,
91 ThreadAmILastThread,
92 ThreadIdealProcessor,
93 ThreadPriorityBoost,
94 ThreadSetTlsArrayAddress,
95 ThreadIsIoPending,
96 MaxThreadInfoClass
97} THREADINFOCLASS;
98
99typedef enum _FILE_INFORMATION_CLASS {
100 FileDirectoryInformation = 1,
101 FileFullDirectoryInformation,
102 FileBothDirectoryInformation,
103 FileBasicInformation,
104 FileStandardInformation,
105 FileInternalInformation,
106 FileEaInformation,
107 FileAccessInformation,
108 FileNameInformation,
109 FileRenameInformation,
110 FileLinkInformation,
111 FileNamesInformation,
112 FileDispositionInformation,
113 FilePositionInformation,
114 FileFullEaInformation,
115 FileModeInformation,
116 FileAlignmentInformation,
117 FileAllInformation,
118 FileAllocationInformation,
119 FileEndOfFileInformation,
120 FileAlternateNameInformation,
121 FileStreamInformation,
122 FilePipeInformation,
123 FilePipeLocalInformation,
124 FilePipeRemoteInformation,
125 FileMailslotQueryInformation,
126 FileMailslotSetInformation,
127 FileCompressionInformation,
128 FileObjectIdInformation,
129 FileCompletionInformation,
130 FileMoveClusterInformation,
131 FileQuotaInformation,
132 FileReparsePointInformation,
133 FileNetworkOpenInformation,
134 FileAttributeTagInformation,
135 FileTrackingInformation,
136 FileMaximumInformation
137} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
138
139typedef enum _SECTION_INHERIT
140{
141 ViewShare = 1,
142 ViewUnmap = 2
143
144} SECTION_INHERIT;
145
146/*
147 placeholder
148*/
149typedef enum _OBJECT_INFORMATION_CLASS
150{
151 DunnoTheConstants1
152
153} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
154
155
156/*
157 * NtQuerySystemInformation
158 */
159
160typedef enum SYSTEM_INFORMATION_CLASS
161{ Unknown1 = 1,
162 Unknown2,
163 Unknown3,
164 Unknown4,
165 SystemPerformanceInformation
166} SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;
167
168/* reading coffee grounds... */
169typedef struct _THREAD_INFO
170{ DWORD Unknown1[6];
171 DWORD ThreadID;
172 DWORD Unknown2[3];
173 DWORD Status;
174 DWORD WaitReason;
175 DWORD Unknown3[4];
176} THREAD_INFO, PTHREAD_INFO;
177
178typedef struct _VM_COUNTERS_
179{ ULONG PeakVirtualSize;
180 ULONG VirtualSize;
181 ULONG PageFaultCount;
182 ULONG PeakWorkingSetSize;
183 ULONG WorkingSetSize;
184 ULONG QuotaPeakPagedPoolUsage;
185 ULONG QuotaPagedPoolUsage;
186 ULONG QuotaPeakNonPagedPoolUsage;
187 ULONG QuotaNonPagedPoolUsage;
188 ULONG PagefileUsage;
189 ULONG PeakPagefileUsage;
190} VM_COUNTERS, *PVM_COUNTERS;
191
192typedef struct _PROCESS_INFO
193{ DWORD Offset; /* 00 offset to next PROCESS_INFO ok*/
194 DWORD ThreadCount; /* 04 number of ThreadInfo member ok */
195 DWORD Unknown1[6];
196 FILETIME CreationTime; /* 20 */
197 DWORD Unknown2[5];
198 PWCHAR ProcessName; /* 3c ok */
199 DWORD BasePriority;
200 DWORD ProcessID; /* 44 ok*/
201 DWORD ParentProcessID;
202 DWORD HandleCount;
203 DWORD Unknown3[2]; /* 50 */
204 ULONG PeakVirtualSize;
205 ULONG VirtualSize;
206 ULONG PageFaultCount;
207 ULONG PeakWorkingSetSize;
208 ULONG WorkingSetSize;
209 ULONG QuotaPeakPagedPoolUsage;
210 ULONG QuotaPagedPoolUsage;
211 ULONG QuotaPeakNonPagedPoolUsage;
212 ULONG QuotaNonPagedPoolUsage;
213 ULONG PagefileUsage;
214 ULONG PeakPagefileUsage;
215 DWORD PrivateBytes;
216 DWORD Unknown6[4];
217 THREAD_INFO ati[ANYSIZE_ARRAY]; /* 94 size=0x40*/
218} PROCESS_INFO, PPROCESS_INFO;
219
220NTSTATUS WINAPI NtQuerySystemInformation(
221 IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
222 OUT PVOID SystemInformation,
223 IN ULONG Length,
224 OUT PULONG ResultLength);
225
226/*
227 * system configuration
228 */
229
230
231typedef struct _SYSTEM_TIME_ADJUSTMENT
232{
233 ULONG TimeAdjustment;
234 BOOLEAN TimeAdjustmentDisabled;
235
236} SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT;
237
238typedef struct _SYSTEM_CONFIGURATION_INFO
239{
240 union
241 { ULONG OemId;
242 struct
243 { WORD ProcessorArchitecture;
244 WORD Reserved;
245 } tag1;
246 } tag2;
247 ULONG PageSize;
248 PVOID MinimumApplicationAddress;
249 PVOID MaximumApplicationAddress;
250 ULONG ActiveProcessorMask;
251 ULONG NumberOfProcessors;
252 ULONG ProcessorType;
253 ULONG AllocationGranularity;
254 WORD ProcessorLevel;
255 WORD ProcessorRevision;
256
257} SYSTEM_CONFIGURATION_INFO, *PSYSTEM_CONFIGURATION_INFO;
258
259
260typedef struct _SYSTEM_CACHE_INFORMATION
261{
262 ULONG CurrentSize;
263 ULONG PeakSize;
264 ULONG PageFaultCount;
265 ULONG MinimumWorkingSet;
266 ULONG MaximumWorkingSet;
267 ULONG Unused[4];
268
269} SYSTEM_CACHE_INFORMATION;
270
271/*
272 * NtQueryProcessInformation
273 */
274
275/* parameter ProcessInformationClass */
276
277typedef enum _PROCESSINFOCLASS
278{ ProcessBasicInformation,
279 ProcessQuotaLimits,
280 ProcessIoCounters,
281 ProcessVmCounters,
282 ProcessTimes,
283 ProcessBasePriority,
284 ProcessRaisePriority,
285 ProcessDebugPort,
286 ProcessExceptionPort,
287 ProcessAccessToken,
288 ProcessLdtInformation,
289 ProcessLdtSize,
290 ProcessDefaultHardErrorMode,
291 ProcessIoPortHandlers,
292 ProcessPooledUsageAndLimits,
293 ProcessWorkingSetWatch,
294 ProcessUserModeIOPL,
295 ProcessEnableAlignmentFaultFixup,
296 ProcessPriorityClass,
297 ProcessWx86Information,
298 ProcessHandleCount,
299 ProcessAffinityMask,
300 ProcessPriorityBoost,
301 ProcessDeviceMap,
302 ProcessSessionInformation,
303 ProcessForegroundInformation,
304 ProcessWow64Information,
305 MaxProcessInfoClass
306} PROCESSINFOCLASS;
307
308/* parameter ProcessInformation (depending on ProcessInformationClass) */
309
310typedef struct _PROCESS_BASIC_INFORMATION
311{ DWORD ExitStatus;
312 DWORD PebBaseAddress;
313 DWORD AffinityMask;
314 DWORD BasePriority;
315 ULONG UniqueProcessId;
316 ULONG InheritedFromUniqueProcessId;
317} PROCESS_BASIC_INFORMATION;
318
319NTSTATUS WINAPI NtQueryInformationProcess(
320 IN HANDLE ProcessHandle,
321 IN PROCESSINFOCLASS ProcessInformationClass,
322 OUT PVOID ProcessInformation,
323 IN ULONG ProcessInformationLength,
324 OUT PULONG ReturnLength);
325
326#define NtCurrentProcess() ( (HANDLE) -1 )
327
328/*
329 * timer
330 */
331
332typedef enum _TIMER_TYPE
333{
334 NotificationTimer,
335 SynchronizationTimer
336
337} TIMER_TYPE;
338
339/*
340 * token functions
341 */
342
343NTSTATUS WINAPI NtOpenProcessToken(
344 HANDLE ProcessHandle,
345 DWORD DesiredAccess,
346 HANDLE *TokenHandle);
347
348NTSTATUS WINAPI NtOpenThreadToken(
349 HANDLE ThreadHandle,
350 DWORD DesiredAccess,
351 BOOLEAN OpenAsSelf,
352 HANDLE *TokenHandle);
353
354NTSTATUS WINAPI NtAdjustPrivilegesToken(
355 IN HANDLE TokenHandle,
356 IN BOOLEAN DisableAllPrivileges,
357 IN PTOKEN_PRIVILEGES NewState,
358 IN DWORD BufferLength,
359 OUT PTOKEN_PRIVILEGES PreviousState,
360 OUT PDWORD ReturnLength);
361
362NTSTATUS WINAPI NtQueryInformationToken(
363 HANDLE token,
364 DWORD tokeninfoclass,
365 LPVOID tokeninfo,
366 DWORD tokeninfolength,
367 LPDWORD retlen );
368
369/*
370 * sid functions
371 */
372
373BOOLEAN WINAPI RtlAllocateAndInitializeSid ( PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
374 BYTE nSubAuthorityCount,
375 DWORD nSubAuthority0,
376 DWORD nSubAuthority1,
377 DWORD nSubAuthority2,
378 DWORD nSubAuthority3,
379 DWORD nSubAuthority4,
380 DWORD nSubAuthority5,
381 DWORD nSubAuthority6,
382 DWORD nSubAuthority7,
383 PSID *pSid);
384
385BOOL WINAPI RtlEqualSid(PSID pSid1, PSID pSid2);
386BOOL WINAPI RtlEqualPrefixSid (PSID pSid1, PSID pSid2);
387BOOL WINAPI RtlValidSid( PSID pSid );
388VOID* WINAPI RtlFreeSid(PSID pSid);
389DWORD WINAPI RtlLengthRequiredSid(DWORD nrofsubauths);
390DWORD WINAPI RtlLengthSid(PSID sid);
391DWORD WINAPI RtlInitializeSid(PSID PSID,PSID_IDENTIFIER_AUTHORITY PSIDauth, DWORD c);
392LPDWORD WINAPI RtlSubAuthoritySid(PSID PSID,DWORD nr);
393LPBYTE WINAPI RtlSubAuthorityCountSid(PSID PSID);
394PSID_IDENTIFIER_AUTHORITY WINAPI RtlIdentifierAuthoritySid( PSID pSid );
395DWORD WINAPI RtlCopySid(DWORD len,PSID to,PSID from);
396
397/*
398 * security descriptor functions
399 */
400
401NTSTATUS WINAPI RtlCreateSecurityDescriptor(
402 PSECURITY_DESCRIPTOR lpsd,
403 DWORD rev);
404
405NTSTATUS WINAPI RtlValidSecurityDescriptor(
406 PSECURITY_DESCRIPTOR SecurityDescriptor);
407
408ULONG WINAPI RtlLengthSecurityDescriptor(
409 PSECURITY_DESCRIPTOR SecurityDescriptor);
410
411NTSTATUS WINAPI RtlGetDaclSecurityDescriptor(
412 IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
413 OUT PBOOLEAN lpbDaclPresent,
414 OUT PACL *pDacl,
415 OUT PBOOLEAN lpbDaclDefaulted);
416
417NTSTATUS WINAPI RtlSetDaclSecurityDescriptor (
418 PSECURITY_DESCRIPTOR lpsd,
419 BOOLEAN daclpresent,
420 PACL dacl,
421 BOOLEAN dacldefaulted );
422
423NTSTATUS WINAPI RtlGetSaclSecurityDescriptor(
424 IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
425 OUT PBOOLEAN lpbSaclPresent,
426 OUT PACL *pSacl,
427 OUT PBOOLEAN lpbSaclDefaulted);
428
429NTSTATUS WINAPI RtlSetSaclSecurityDescriptor (
430 PSECURITY_DESCRIPTOR lpsd,
431 BOOLEAN saclpresent,
432 PACL sacl,
433 BOOLEAN sacldefaulted);
434
435NTSTATUS WINAPI RtlGetOwnerSecurityDescriptor(
436 PSECURITY_DESCRIPTOR SecurityDescriptor,
437 PSID *Owner,
438 PBOOLEAN OwnerDefaulted);
439
440NTSTATUS WINAPI RtlSetOwnerSecurityDescriptor(
441 PSECURITY_DESCRIPTOR lpsd,
442 PSID owner,
443 BOOLEAN ownerdefaulted);
444
445NTSTATUS WINAPI RtlSetGroupSecurityDescriptor (
446 PSECURITY_DESCRIPTOR lpsd,
447 PSID group,
448 BOOLEAN groupdefaulted);
449
450NTSTATUS WINAPI RtlGetGroupSecurityDescriptor(
451 PSECURITY_DESCRIPTOR SecurityDescriptor,
452 PSID *Group,
453 PBOOLEAN GroupDefaulted);
454
455
456
457/*
458 * resource functions
459 */
460
461typedef struct _RTL_RWLOCK {
462 CRITICAL_SECTION rtlCS;
463 HANDLE hSharedReleaseSemaphore;
464 UINT uSharedWaiters;
465 HANDLE hExclusiveReleaseSemaphore;
466 UINT uExclusiveWaiters;
467 INT iNumberActive;
468 HANDLE hOwningThreadId;
469 DWORD dwTimeoutBoost;
470 PVOID pDebugInfo;
471} RTL_RWLOCK, *LPRTL_RWLOCK;
472
473VOID WINAPI RtlInitializeResource(
474 LPRTL_RWLOCK);
475
476VOID WINAPI RtlDeleteResource(
477 LPRTL_RWLOCK);
478
479BYTE WINAPI RtlAcquireResourceExclusive(
480 LPRTL_RWLOCK, BYTE fWait);
481
482BYTE WINAPI RtlAcquireResourceShared(
483 LPRTL_RWLOCK, BYTE fWait);
484
485VOID WINAPI RtlReleaseResource(
486 LPRTL_RWLOCK);
487
488VOID WINAPI RtlDumpResource(
489 LPRTL_RWLOCK);
490
491/*
492 time functions
493 */
494
495typedef struct _TIME_FIELDS
496{ CSHORT Year;
497 CSHORT Month;
498 CSHORT Day;
499 CSHORT Hour;
500 CSHORT Minute;
501 CSHORT Second;
502 CSHORT Milliseconds;
503 CSHORT Weekday;
504} TIME_FIELDS;
505
506typedef TIME_FIELDS *PTIME_FIELDS;
507
508VOID WINAPI RtlSystemTimeToLocalTime(
509 IN PLARGE_INTEGER SystemTime,
510 OUT PLARGE_INTEGER LocalTime);
511
512VOID WINAPI RtlTimeToTimeFields(
513 PLARGE_INTEGER liTime,
514 PTIME_FIELDS TimeFields);
515
516BOOLEAN WINAPI RtlTimeFieldsToTime(
517 PTIME_FIELDS tfTimeFields,
518 PLARGE_INTEGER Time);
519
520VOID WINAPI RtlTimeToElapsedTimeFields(
521 PLARGE_INTEGER liTime,
522 PTIME_FIELDS TimeFields);
523
524BOOLEAN WINAPI RtlTimeToSecondsSince1980(
525 LPFILETIME ft,
526 LPDWORD timeret);
527
528BOOLEAN WINAPI RtlTimeToSecondsSince1970(
529 LPFILETIME ft,
530 LPDWORD timeret);
531
532BOOLEAN WINAPI RtlSecondsSince1970ToTime(LPFILETIME ft, LPDWORD timeret);
533BOOLEAN WINAPI RtlSecondsSince1980ToTime(LPFILETIME ft, LPDWORD timeret);
534
535
536/*
537 heap functions
538*/
539
540/* Data structure for heap definition. This includes various
541 sizing parameters and callback routines, which, if left NULL,
542 result in default behavior */
543
544typedef struct
545{ ULONG Length; /* = sizeof(RTL_HEAP_DEFINITION) */
546 ULONG Unknown[11];
547} RTL_HEAP_DEFINITION, *PRTL_HEAP_DEFINITION;
548
549HANDLE WINAPI RtlCreateHeap(
550 ULONG Flags,
551 PVOID BaseAddress,
552 ULONG SizeToReserve,
553 ULONG SizeToCommit,
554 PVOID Unknown,
555 PRTL_HEAP_DEFINITION Definition);
556
557PVOID WINAPI RtlAllocateHeap(
558 HANDLE Heap,
559 ULONG Flags,
560 ULONG Size);
561
562
563BOOLEAN WINAPI RtlFreeHeap(
564 HANDLE Heap,
565 ULONG Flags,
566 PVOID Address);
567
568/*
569 * misc
570 */
571void __cdecl DbgPrint(LPCSTR fmt,LPVOID args);
572void WINAPI REGS_FUNC(DebugBreak)( CONTEXT *context );
573void WINAPI RtlRaiseStatus( NTSTATUS status );
574void WINAPI REGS_FUNC(NtRaiseException)( EXCEPTION_RECORD *rec, CONTEXT *ctx, BOOL first, CONTEXT *context );
575//void WINAPI REGS_FUNC(RtlUnwind)( PEXCEPTION_FRAME pEndFrame, LPVOID unusedEip, PEXCEPTION_RECORD pRecord, DWORD returnEax, CONTEXT *context );
576void WINAPI REGS_FUNC(RtlRaiseException)( EXCEPTION_RECORD *rec, CONTEXT *context );
577
578VOID WINAPI RtlAcquirePebLock(void);
579VOID WINAPI RtlReleasePebLock(void);
580DWORD WINAPI RtlAdjustPrivilege(DWORD x1,DWORD x2,DWORD x3,DWORD x4);
581DWORD WINAPI RtlIntegerToChar(DWORD x1,DWORD x2,DWORD x3,DWORD x4);
582DWORD WINAPI RtlSetEnvironmentVariable(DWORD x1,PUNICODE_STRING key,PUNICODE_STRING val);
583DWORD WINAPI RtlNewSecurityObject(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6);
584DWORD WINAPI RtlDeleteSecurityObject(DWORD x1);
585LPVOID WINAPI RtlNormalizeProcessParams(LPVOID x);
586DWORD WINAPI RtlNtStatusToDosError(DWORD error);
587BOOLEAN WINAPI RtlGetNtProductType(LPDWORD type);
588INT WINAPI RtlExtendedLargeIntegerDivide(LARGE_INTEGER dividend, DWORD divisor, LPDWORD rest);
589LARGE_INTEGER WINAPI RtlExtendedIntegerMultiply(LARGE_INTEGER factor1,INT factor2);
590DWORD WINAPI RtlFormatCurrentUserKeyPath(PUNICODE_STRING pustrKeyPath);
591DWORD WINAPI RtlOpenCurrentUser(DWORD x1, DWORD *x2);
592BOOLEAN WINAPI RtlDosPathNameToNtPathName_U( LPWSTR from,PUNICODE_STRING us,DWORD x2,DWORD x3);
593DWORD WINAPI RtlCreateEnvironment(DWORD x1,DWORD x2);
594DWORD WINAPI RtlDestroyEnvironment(DWORD x);
595DWORD WINAPI RtlQueryEnvironmentVariable_U(DWORD x1,PUNICODE_STRING key,PUNICODE_STRING val) ;
596
597BOOL WINAPI IsValidSid(PSID);
598BOOL WINAPI EqualSid(PSID,PSID);
599BOOL WINAPI EqualPrefixSid(PSID,PSID);
600DWORD WINAPI GetSidLengthRequired(BYTE);
601BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,
602 DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,
603 DWORD,PSID*);
604VOID* WINAPI FreeSid(PSID);
605BOOL WINAPI InitializeSecurityDescriptor(SECURITY_DESCRIPTOR*,DWORD);
606BOOL WINAPI InitializeSid(PSID,PSID_IDENTIFIER_AUTHORITY,BYTE);
607DWORD* WINAPI GetSidSubAuthority(PSID,DWORD);
608BYTE * WINAPI GetSidSubAuthorityCount(PSID);
609DWORD WINAPI GetLengthSid(PSID);
610BOOL WINAPI CopySid(DWORD,PSID,PSID);
611BOOL WINAPI LookupAccountSidA(LPCSTR,PSID,LPCSTR,LPDWORD,LPCSTR,LPDWORD,
612 PSID_NAME_USE);
613BOOL WINAPI LookupAccountSidW(LPCWSTR,PSID,LPCWSTR,LPDWORD,LPCWSTR,LPDWORD,
614 PSID_NAME_USE);
615PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(PSID);
616
617#ifdef __cplusplus
618}
619#endif
620
621#endif
Note: See TracBrowser for help on using the repository browser.