source: trunk/src/NTDLL/nt.cpp@ 2122

Last change on this file since 2122 was 2122, checked in by sandervl, 26 years ago

Partially implemented some Token & SID apis

File size: 23.7 KB
Line 
1/* $Id: nt.cpp,v 1.3 1999-12-18 20:01:13 sandervl Exp $ */
2
3
4/*
5 * NT basis DLL
6 *
7 * This file contains the Nt* API functions of NTDLL.DLL.
8 * In the original ntdll.dll they all seem to just call int 0x2e (down to the HAL)
9 *
10 * Copyright 1996-1998 Marcus Meissner
11 * Copyright 1999 Patrick Haller
12 */
13
14#include <stdlib.h>
15#include <string.h>
16#include <time.h>
17
18#include "ntdll.h"
19
20
21/* move to winbase.h */
22
23// @@@PH can't compile this WINE code
24//typedef VOID (CALLBACK *PTIMERAPCROUTINE)(LPVOID lpArgToCompletionRoutine,DWORD dwTimerLowValue,DWORD dwTimerHighValue);
25typedef PVOID PTIMERAPCROUTINE;
26
27
28/*
29 * Timer object
30 */
31
32/**************************************************************************
33 * NtCreateTimer [NTDLL.87]
34 */
35NTSTATUS WINAPI NtCreateTimer(PHANDLE TimerHandle,
36 ACCESS_MASK DesiredAccess,
37 POBJECT_ATTRIBUTES ObjectAttributes,
38 TIMER_TYPE TimerType)
39{
40 dprintf(("NTDLL: NtCreateTimer(%08xh,%08xh,%08xh,%08xh) not implemented.\n",
41 TimerHandle,
42 DesiredAccess,
43 ObjectAttributes,
44 TimerType));
45
46 return 0;
47}
48
49
50/**************************************************************************
51 * NtSetTimer [NTDLL.221]
52 */
53NTSTATUS WINAPI NtSetTimer(HANDLE TimerHandle,
54 PLARGE_INTEGER DueTime,
55 PTIMERAPCROUTINE TimerApcRoutine,
56 PVOID TimerContext,
57 BOOLEAN WakeTimer,
58 ULONG Period,
59 PBOOLEAN PreviousState)
60{
61 dprintf(("NTDLL: NtSetTimer(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
62 TimerHandle,
63 DueTime,
64 TimerApcRoutine,
65 TimerContext,
66 WakeTimer,
67 Period,
68 PreviousState));
69
70 return 0;
71}
72
73
74/******************************************************************************
75 * NtQueryTimerResolution [NTDLL.129]
76 */
77NTSTATUS WINAPI NtQueryTimerResolution(DWORD x1,
78 DWORD x2,
79 DWORD x3)
80{
81 dprintf(("NTDLL: NtQueryTimerResolution(%08xh,%08xh,%08xh) not implemented.\n",
82 x1,
83 x2,
84 x3));
85
86 return 1;
87}
88
89
90/*
91 * Process object
92 */
93
94/******************************************************************************
95 * NtTerminateProcess [NTDLL.]
96 *
97 * Native applications must kill themselves when done
98 * FIXME: return value 0-success
99 */
100NTSTATUS WINAPI NtTerminateProcess(HANDLE ProcessHandle,
101 LONG ExitStatus)
102{
103 dprintf(("NTDLL: NtTerminateProcess(%08xh,%08xh)",
104 ProcessHandle,
105 ExitStatus));
106
107 /* win32 (0x7fffffff) to nt (-1) */
108 if ( NtCurrentProcess() == ProcessHandle )
109 ProcessHandle = GetCurrentProcess();
110
111 /* @@@PH return code looks suspicious ! */
112 return (! TerminateProcess( ProcessHandle, ExitStatus ));
113}
114
115
116/******************************************************************************
117* NtQueryInformationProcess [NTDLL.]
118*
119*/
120NTSTATUS WINAPI NtQueryInformationProcess(HANDLE ProcessHandle,
121 PROCESSINFOCLASS ProcessInformationClass,
122 PVOID ProcessInformation,
123 ULONG ProcessInformationLength,
124 PULONG ReturnLength)
125{
126 dprintf(("NTDLL: NtQueryInformationProcess(%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
127 ProcessHandle,
128 ProcessInformationClass,
129 ProcessInformation,
130 ProcessInformationLength,
131 ReturnLength));
132
133 return 0;
134}
135
136/******************************************************************************
137 * NtSetInformationProcess [NTDLL.207]
138 */
139NTSTATUS WINAPI NtSetInformationProcess(HANDLE ProcessHandle,
140 PROCESSINFOCLASS ProcessInformationClass,
141 PVOID ProcessInformation,
142 ULONG ProcessInformationLength)
143{
144 dprintf(("NTDLL: NtSetInformationProcess(%08xh,%08xh,%08xh,%08xh) not implemented.\n",
145 ProcessHandle,
146 ProcessInformationClass,
147 ProcessInformation,
148 ProcessInformationLength));
149
150 return 0;
151}
152
153
154/*
155 * Thread
156 */
157
158/******************************************************************************
159 * NtResumeThread [NTDLL]
160 */
161NTSTATUS WINAPI NtResumeThread(HANDLE ThreadHandle,
162 PULONG SuspendCount)
163{
164 dprintf(("NTDLL: NtResumeThread(%08xh,%08x) not implemented.\n",
165 ThreadHandle,
166 SuspendCount));
167
168 return 0;
169}
170
171
172/******************************************************************************
173 * NtTerminateThread [NTDLL]
174 */
175NTSTATUS WINAPI NtTerminateThread(HANDLE ThreadHandle,
176 NTSTATUS ExitStatus)
177{
178 dprintf(("NTDLL: NtTerminateThread(%08xh,%08xh) not correctly implemented.\n",
179 ThreadHandle,
180 ExitStatus));
181
182 if ( TerminateThread(ThreadHandle,ExitStatus) )
183 return 0;
184
185 return 0xc0000000; /* FIXME: lasterror->ntstatus */
186}
187
188
189/******************************************************************************
190* NtQueryInformationThread [NTDLL.]
191*
192*/
193NTSTATUS WINAPI NtQueryInformationThread(HANDLE ThreadHandle,
194 THREADINFOCLASS ThreadInformationClass,
195 PVOID ThreadInformation,
196 ULONG ThreadInformationLength,
197 PULONG ReturnLength)
198{
199 dprintf(("NTDLL: NtQueryInformationThread(%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
200 ThreadHandle,
201 ThreadInformationClass,
202 ThreadInformation,
203 ThreadInformationLength,
204 ReturnLength));
205
206 return 0;
207}
208
209
210/******************************************************************************
211 * NtSetInformationThread [NTDLL]
212 */
213NTSTATUS WINAPI NtSetInformationThread(HANDLE ThreadHandle,
214 THREADINFOCLASS ThreadInformationClass,
215 PVOID ThreadInformation,
216 ULONG ThreadInformationLength)
217{
218 dprintf(("NTDLL: NtSetInformationThread(%08xh,%08xh,%08xh,%08xh) not implemented.\n",
219 ThreadHandle,
220 ThreadInformationClass,
221 ThreadInformation,
222 ThreadInformationLength));
223
224 return 0;
225}
226
227
228/*
229 * Token
230 */
231
232/******************************************************************************
233 * NtDuplicateToken [NTDLL]
234 */
235NTSTATUS WINAPI NtDuplicateToken(HANDLE ExistingToken,
236 ACCESS_MASK DesiredAccess,
237 POBJECT_ATTRIBUTES ObjectAttributes,
238 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
239 TOKEN_TYPE TokenType,
240 PHANDLE NewToken)
241{
242 dprintf(("NTDLL: NtDuplicateToken(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
243 ExistingToken,
244 DesiredAccess,
245 ObjectAttributes,
246 ImpersonationLevel,
247 TokenType,
248 NewToken));
249
250 return 0;
251}
252
253/******************************************************************************
254 * NtOpenProcessToken [NTDLL]
255 */
256NTSTATUS WINAPI NtOpenProcessToken(HANDLE ProcessHandle,
257 DWORD DesiredAccess,
258 PHANDLE TokenHandle)
259{
260 dprintf(("NTDLL: NtOpenProcessToken(%08xh,%08xh,%08xh) not implemented.\n",
261 ProcessHandle,
262 DesiredAccess,
263 TokenHandle));
264
265 *TokenHandle = 0xcafe;
266 return 0;
267}
268
269
270/******************************************************************************
271 * NtOpenThreadToken [NTDLL]
272 */
273NTSTATUS WINAPI NtOpenThreadToken(HANDLE ThreadHandle,
274 DWORD DesiredAccess,
275 BOOLEAN OpenAsSelf,
276 PHANDLE TokenHandle)
277{
278 dprintf(("NTDLL: NtOpenThreadToken(%08xh,%08xh,%08xh,%08xh) not implemented.\n",
279 ThreadHandle,
280 DesiredAccess,
281 OpenAsSelf,
282 TokenHandle));
283
284 *TokenHandle = 0xcafe;
285 return 0;
286}
287
288
289/******************************************************************************
290 * NtAdjustPrivilegesToken [NTDLL]
291 *
292 * FIXME: parameters unsafe
293 */
294NTSTATUS WINAPI NtAdjustPrivilegesToken(HANDLE TokenHandle,
295 BOOLEAN DisableAllPrivileges,
296 PTOKEN_PRIVILEGES NewState,
297 DWORD BufferLength,
298 PTOKEN_PRIVILEGES PreviousState,
299 PDWORD ReturnLength)
300{
301 dprintf(("NTDLL: NtAdjustPrivilegesToken(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
302 TokenHandle,
303 DisableAllPrivileges,
304 NewState,
305 BufferLength,
306 PreviousState,
307 ReturnLength));
308
309 return 0;
310}
311
312
313/******************************************************************************
314* NtQueryInformationToken [NTDLL.156]
315*
316*/
317NTSTATUS WINAPI NtQueryInformationToken(HANDLE Token,
318 DWORD TokenInformationClass,
319 LPVOID TokenInformation,
320 DWORD TokenInformationLength,
321 LPDWORD ReturnLength)
322{
323 dprintf(("NTDLL: NtQueryInformationToken(%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
324 Token,
325 TokenInformationClass,
326 TokenInformation,
327 TokenInformationLength,
328 ReturnLength));
329
330 switch (TokenInformationClass)
331 {
332 case TokenGroups: /* 2 */
333 *ReturnLength = sizeof (TOKEN_GROUPS);
334 if(TokenInformationLength < sizeof (TOKEN_GROUPS)) {
335 return STATUS_BUFFER_TOO_SMALL;
336 }
337 memset(TokenInformation, 0, sizeof(TOKEN_GROUPS));
338 break;
339 case TokenUser: /* 1 */
340 *ReturnLength = sizeof (TOKEN_USER);
341 if(TokenInformationLength < sizeof (TOKEN_USER)) {
342 return STATUS_BUFFER_TOO_SMALL;
343 }
344 memset(TokenInformation, 0, sizeof(TOKEN_USER));
345 break;
346 case TokenPrivileges:
347 *ReturnLength = sizeof (TOKEN_PRIVILEGES);
348 if(TokenInformationLength < sizeof (TOKEN_PRIVILEGES)) {
349 return STATUS_BUFFER_TOO_SMALL;
350 }
351 memset(TokenInformation, 0, sizeof(TOKEN_PRIVILEGES));
352 break;
353 case TokenOwner:
354 *ReturnLength = sizeof (TOKEN_OWNER);
355 if(TokenInformationLength < sizeof (TOKEN_OWNER)) {
356 return STATUS_BUFFER_TOO_SMALL;
357 }
358 memset(TokenInformation, 0, sizeof(TOKEN_OWNER));
359 break;
360 case TokenPrimaryGroup:
361 *ReturnLength = sizeof (TOKEN_PRIMARY_GROUP);
362 if(TokenInformationLength < sizeof (TOKEN_PRIMARY_GROUP)) {
363 return STATUS_BUFFER_TOO_SMALL;
364 }
365 memset(TokenInformation, 0, sizeof(TOKEN_PRIMARY_GROUP));
366 break;
367 case TokenDefaultDacl:
368 *ReturnLength = sizeof (TOKEN_DEFAULT_DACL);
369 if(TokenInformationLength < sizeof (TOKEN_DEFAULT_DACL)) {
370 return STATUS_BUFFER_TOO_SMALL;
371 }
372 memset(TokenInformation, 0, sizeof(TOKEN_DEFAULT_DACL));
373 break;
374 case TokenSource:
375 *ReturnLength = sizeof (TOKEN_SOURCE);
376 if(TokenInformationLength < sizeof (TOKEN_SOURCE)) {
377 return STATUS_BUFFER_TOO_SMALL;
378 }
379 memset(TokenInformation, 0, sizeof(TOKEN_SOURCE));
380 break;
381 case TokenType:
382 *ReturnLength = sizeof (TOKEN_TYPE);
383 if(TokenInformationLength < sizeof (TOKEN_TYPE)) {
384 return STATUS_BUFFER_TOO_SMALL;
385 }
386 memset(TokenInformation, 0, sizeof(TOKEN_TYPE));
387 break;
388#if 0
389 case TokenImpersonationLevel:
390 case TokenStatistics:
391#endif /* 0 */
392 }
393
394 return STATUS_SUCCESS;
395}
396
397
398/*
399 * Section
400 */
401
402/******************************************************************************
403 * NtCreateSection [NTDLL]
404 */
405NTSTATUS WINAPI NtCreateSection(PHANDLE SectionHandle,
406 ACCESS_MASK DesiredAccess,
407 POBJECT_ATTRIBUTES ObjectAttributes,
408 PLARGE_INTEGER MaximumSize,
409 ULONG SectionPageProtection,
410 ULONG AllocationAttributes,
411 HANDLE FileHandle)
412{
413 dprintf(("NTDLL: NtCreateSection(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
414 SectionHandle,
415 DesiredAccess,
416 ObjectAttributes,
417 MaximumSize,
418 SectionPageProtection,
419 AllocationAttributes,
420 FileHandle));
421
422 return 0;
423}
424
425
426/******************************************************************************
427 * NtOpenSection [NTDLL]
428 */
429NTSTATUS WINAPI NtOpenSection(PHANDLE SectionHandle,
430 ACCESS_MASK DesiredAccess,
431 POBJECT_ATTRIBUTES ObjectAttributes)
432{
433 dprintf(("NTDLL: NtOpenSection(%08xh,%08xh,%08xh) not implemented.\n",
434 SectionHandle,
435 DesiredAccess,
436 ObjectAttributes));
437
438 return 0;
439}
440
441
442/******************************************************************************
443 * NtQuerySection [NTDLL]
444 */
445NTSTATUS WINAPI NtQuerySection(HANDLE SectionHandle,
446 PVOID SectionInformationClass,
447 PVOID SectionInformation,
448 ULONG Length,
449 PULONG ResultLength)
450{
451 dprintf(("NTDLL: NtQuerySection(%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
452 SectionHandle,
453 SectionInformationClass,
454 SectionInformation,
455 Length,
456 ResultLength));
457
458 return 0;
459}
460
461
462/******************************************************************************
463 * NtMapViewOfSection [NTDLL]
464 * FUNCTION: Maps a view of a section into the virtual address space of a process
465 *
466 * ARGUMENTS:
467 * SectionHandle Handle of the section
468 * ProcessHandle Handle of the process
469 * BaseAddress Desired base address (or NULL) on entry
470 * Actual base address of the view on exit
471 * ZeroBits Number of high order address bits that must be zero
472 * CommitSize Size bytes of the initially committed section of the view
473 * SectionOffset Offset bytes from the beginning of the section to the beginning of the view
474 * ViewSize Desired length of map (or zero to map all) on entry
475 Actual length mapped on exit
476 * InheritDisposition Specified how the view is to be shared with
477 * child processes
478 * AllocateType Type of allocation for the pages
479 * Protect Protection for the committed region of the view
480 */
481NTSTATUS WINAPI NtMapViewOfSection(HANDLE SectionHandle,
482 HANDLE ProcessHandle,
483 PVOID* BaseAddress,
484 ULONG ZeroBits,
485 ULONG CommitSize,
486 PLARGE_INTEGER SectionOffset,
487 PULONG ViewSize,
488 SECTION_INHERIT InheritDisposition,
489 ULONG AllocationType,
490 ULONG Protect)
491{
492 dprintf(("NTDLL: NtMapViewOfSection(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
493 SectionHandle,
494 ProcessHandle,
495 BaseAddress,
496 ZeroBits,
497 CommitSize,
498 SectionOffset,
499 ViewSize,
500 InheritDisposition,
501 AllocationType,
502 Protect));
503
504 return 0;
505}
506
507
508/*
509 * ports
510 */
511
512/******************************************************************************
513 * NtCreatePort [NTDLL]
514 */
515NTSTATUS WINAPI NtCreatePort(DWORD x1,
516 DWORD x2,
517 DWORD x3,
518 DWORD x4,
519 DWORD x5)
520{
521 dprintf(("NTDLL: NtCreatePort(%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
522 x1,
523 x2,
524 x3,
525 x4,
526 x5));
527
528 return 0;
529}
530
531
532/******************************************************************************
533 * NtConnectPort [NTDLL]
534 */
535NTSTATUS WINAPI NtConnectPort(DWORD x1,
536 PUNICODE_STRING uni,
537 DWORD x3,
538 DWORD x4,
539 DWORD x5,
540 DWORD x6,
541 DWORD x7,
542 DWORD x8)
543{
544 dprintf(("NTDLL: NtConnectPort(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
545 x1,
546 uni,
547 x3,
548 x4,
549 x5,
550 x6,
551 x7,
552 x8));
553
554 return 0;
555}
556
557
558/******************************************************************************
559 * NtListenPort [NTDLL]
560 */
561NTSTATUS WINAPI NtListenPort(DWORD x1,
562 DWORD x2)
563{
564 dprintf(("NTDLL: NtListenPort(%08xh,%08xh) not implemented.\n",
565 x1,
566 x2));
567
568 return 0;
569}
570
571
572/******************************************************************************
573 * NtAcceptConnectPort [NTDLL]
574 */
575NTSTATUS WINAPI NtAcceptConnectPort(DWORD x1,
576 DWORD x2,
577 DWORD x3,
578 DWORD x4,
579 DWORD x5,
580 DWORD x6)
581{
582 dprintf(("NTDLL: NtAcceptConnectPort(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
583 x1,
584 x2,
585 x3,
586 x4,
587 x5,
588 x6));
589
590 return 0;
591}
592
593
594/******************************************************************************
595 * NtCompleteConnectPort [NTDLL]
596 */
597NTSTATUS WINAPI NtCompleteConnectPort(DWORD x1)
598{
599 dprintf(("NTDLL: NtCompleteConnectPort(%08xh) not implemented.\n",
600 x1));
601
602 return 0;
603}
604
605
606/******************************************************************************
607 * NtRegisterThreadTerminatePort [NTDLL]
608 */
609NTSTATUS WINAPI NtRegisterThreadTerminatePort(DWORD x1)
610{
611 dprintf(("NTDLL: NtRegisterThreadTerminatePort(%08xh) not implemented.\n",
612 x1));
613
614 return 0;
615}
616
617
618/******************************************************************************
619 * NtRequestWaitReplyPort [NTDLL]
620 */
621NTSTATUS WINAPI NtRequestWaitReplyPort(DWORD x1,
622 DWORD x2,
623 DWORD x3)
624{
625 dprintf(("NTDLL: NtRequestWaitReplyPort(%08xh,%08xh,%08xh) not implemented.\n",
626 x1,
627 x2,
628 x3));
629
630 return 0;
631}
632
633
634/******************************************************************************
635 * NtReplyWaitReceivePort [NTDLL]
636 */
637NTSTATUS WINAPI NtReplyWaitReceivePort(DWORD x1,
638 DWORD x2,
639 DWORD x3,
640 DWORD x4)
641{
642 dprintf(("NTDLL: NtReplyWaitReceivePort(%08xh,%08xh,%08xh,%08xh) not implemented.\n",
643 x1,
644 x2,
645 x3,
646 x4));
647
648 return 0;
649}
650
651
652/*
653 * Misc
654 */
655
656 /******************************************************************************
657 * NtSetIntervalProfile [NTDLL]
658 */
659NTSTATUS WINAPI NtSetIntervalProfile(DWORD x1,
660 DWORD x2)
661{
662 dprintf(("NTDLL: NtSetIntervalProfile(%08xh,%08xh) not implemented.\n",
663 x1,
664 x2));
665
666 return 0;
667}
668
669
670/******************************************************************************
671 * NtQueryPerformanceCounter [NTDLL]
672 */
673NTSTATUS WINAPI NtQueryPerformanceCounter(PLARGE_INTEGER Counter,
674 PLARGE_INTEGER Frequency)
675{
676 dprintf(("NTDLL: NtQueryPerformanceCounter(%08xh,%08xh) not implemented.\n",
677 Counter,
678 Frequency));
679
680 return 0;
681}
682
683
684/******************************************************************************
685 * NtCreateMailSlotFile [NTDLL]
686 */
687NTSTATUS WINAPI NtCreateMailslotFile(DWORD x1,
688 DWORD x2,
689 DWORD x3,
690 DWORD x4,
691 DWORD x5,
692 DWORD x6,
693 DWORD x7,
694 DWORD x8)
695{
696 dprintf(("NTDLL: NtCreateMailslotFile(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
697 x1,
698 x2,
699 x3,
700 x4,
701 x5,
702 x6,
703 x7,
704 x8));
705
706 return 0;
707}
708
709
710/******************************************************************************
711 * NtQuerySystemInformation [NTDLL.168]
712 *
713 * ARGUMENTS:
714 * SystemInformationClass Index to a certain information structure
715 * SystemTimeAdjustmentInformation SYSTEM_TIME_ADJUSTMENT
716 * SystemCacheInformation SYSTEM_CACHE_INFORMATION
717 * SystemConfigurationInformation CONFIGURATION_INFORMATION
718 * observed (class/len):
719 * 0x0/0x2c
720 * 0x12/0x18
721 * 0x2/0x138
722 * 0x8/0x600
723 * SystemInformation caller supplies storage for the information structure
724 * Length size of the structure
725 * ResultLength Data written
726 */
727NTSTATUS WINAPI NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass,
728 PVOID SystemInformation,
729 ULONG Length,
730 PULONG ResultLength)
731{
732 dprintf(("NTDLL: NtQuerySystemInformation(%08xh,%08xh,%08xh,%08xh) not implemented.\n",
733 SystemInformationClass,
734 SystemInformation,
735 Length,
736 ResultLength));
737
738 ZeroMemory (SystemInformation, Length);
739 return 0;
740}
741
742
743/******************************************************************************
744 * NtCreatePagingFile [NTDLL]
745 */
746NTSTATUS WINAPI NtCreatePagingFile(PUNICODE_STRING PageFileName,
747 ULONG MinimumSize,
748 ULONG MaximumSize,
749 PULONG ActualSize)
750{
751 dprintf(("NTDLL: NtCreatePagingFile(%08xh, %08xh, %08xh, %08xh) not implemented.\n",
752 PageFileName,
753 MinimumSize,
754 MaximumSize,
755 ActualSize));
756
757 return 0;
758}
759
760
761/******************************************************************************
762 * NtDisplayString [NTDLL.95]
763 *
764 * writes a string to the nt-textmode screen eg. during startup
765 */
766NTSTATUS WINAPI NtDisplayString (PUNICODE_STRING string)
767{
768 dprintf(("NTDLL: NtDisplayString(%08xh\n",
769 string));
770
771 WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
772 string->Buffer,
773 string->Length,
774 0,
775 0);
776
777 return 0;
778}
Note: See TracBrowser for help on using the repository browser.