Sun Jun 28 18:37:02 1998 Alexandre Julliard <julliard@lrc.epfl.ch> * [if1632/signal.c] [miscemu/instr.c] [memory/virtual.c] Moved page-fault handling to INSTR_EmulateInstruction. * [scheduler/thread.c] Added locking and check for own thread in Suspend/ResumeThread. Sat Jun 27 21:25:21 1998 Ulrich Weigand <weigand@informatik.uni-erlangen.de> * [objects/dib.c] [objects/bitmap.c] [objects/oembitmap.c] [graphics/x11drv/bitblt.c] [include/bitmap.h] Improved DIB section handling using page fault handlers. (Note: This patch includes code contributed by Matthew J. Francis.) * [memory/virtual.c] [if1632/signal.c] [include/global.h] Page Fault handler support added. * [if1632/signal.c] [loader/signal.c] [tools/build.c] [misc/system.c] [misc/winsock_dns.c] [include/sig_context.h] [include/thread.h] 16-bit %fs handling improved: Always preserve 16-bit %fs value, always restore 32-bit %fs value for signal handlers. * [if1632/thunk.c] [loader/module.c] [misc/callback.c] [windows/user.c] [loader/ne/resource.c] [include/callback.h] [include/module.h] [if1632/kernel.spec] [if1632/wprocs.spec] Resource Handler function pointer stored as 16-bit SEGPTR. * [loader/task.c] [windows/win.c] [windows/winpos.c] [if1632/user.spec] [if1632/kernel.spec] [loader/ne/module.c] Some minor incompatibilities fixed (Win32s relies on those): GetExePtr, IsWindow16 should set ES on return; WINPOS_SendNCCalcSize should cope with having the WINDOWPOS structure trashed; the OFSTRUCT in the NE module image should be placed *last*. * [include/windows.h] Missing prototype for FlushViewOfFile. * [loader/task.c] Bugfix: Command line should *not* start with a blank. * [loader/ne/segment.c] Bugfix: Fixups to offset 0 were never applied. * [misc/lstr.c] Use debugstr_a in OutputDebugString16. * [msdos/dpmi.c] Stub for int 31 BL=2f AX=7a20 (NetWare: Get VLM Call Address) added. * [msdos/int21.c] Stub for int 21 AX=440d CL=6f (get drive map information) added. Fri Jun 26 18:08:30 1998 Rein Klazes <rklazes@casema.net> * [windows/winpos.c] Fix small buglet that mixed up maximized and minimized windows. * [include/x11drv.h] [objects/dc.c] [graphics/x11drv/pen.c] [graphics/x11drv/graphics.c] Fix some bugs with lines joining styles. Draws rectangles with thick pens now correctly. Fri Jun 26 16:22:23 1998 James Juran <jrj120@psu.edu> * [misc/shell.c] Fixed bug I introduced last release in InternalExtractIcon. * [win32/file.c] Added documentation for CreateFile32A. * [documentation/wine.man] Updated manpage. * [ChangeLog] Added my entry from last release. Fri Jun 26 13:33:30 1998 Huw D M Davies <daviesh@abacus.physics.ox.ac.uk> * [graphics/psdrv/*] [if1632/wineps.spec] [include/psdrv.h] [include/print.h] [objects/gdiobj.c] First stages of an internal Postscript driver. See graphics/psdrv/README . Should print text (badly) from win3.1 notepad, write and winword6. * [documentation/printing] Some notes on printing. * [controls/edit.c] Strip off WS_BORDER in WM_NCREATE, edit draws its own rectangle. EC_USEFONTINFO seems to be used as a left/right value for EM_SETMARGINS and not as an action as the docs say. This actually makes more sense. Scroll the caret back to zero after a WM_SETTEXT. Fri Jun 26 10:56:25 1998 Marcus Meissner <marcus@jet.franken.de> * [if1632/snoop.c] Added win16 inter-dll snooping. * [win32/ordinals.c] KERNEL_485 is GetProcessDword. * [include/xmalloc.h][include/bitmap.h][misc/xmalloc.c] Added xcalloc so we 0 initialize XImages. Fixes/Hides the 'junk around MOPYFish'. * [misc/ntdll.c] Some stubs added. Thu Jun 25 15:22:43 1998 Adrian Harvey <adrian@select.com.au> * [scheduler/thread.c] Implemented SuspendThread and ResumeThread. Thu Jun 25 00:55:03 1998 Peter Hunnisett <hunnise@nortel.ca> * [include/debug.h,dplay.h,dsound.h][multimedia/dsound.c,dplay.c] [relay32/dplayx.spec,dplay.spec][multimedia/Makefile.in] [documentation/status/directplay] Added preliminary support for DirectPlay & DirectPlayLobby. Moved the preliminary stubs put in the dsound files into two new files dplay.h and dplay.c. Added new debug channel (dplay) for this. Created new document to keep track of implementation. * [include/winioctl.h][win32/device.c] Added some framework in DeviceIoControl to, in the future, support the "builtin" windows dwIoControlCodes. Added new header file winioctl.h . * [multimedia/mmsystem.c] Added slightly improved debugging information for PlaySound. Wed Jun 24 12:00:00 1998 Juergen Schmied <juergen.schmied@metronet.de> * [files/profile.c][graphics/x11drv/xfont.c][loader/module.c] Changed lstrcmpi32A to strcasecmp, lstrncmpi32A to strncasecmp, lstrcpy32A to strcpy, lstrlen32A to strlen, lstrcmp32A to strcmp because it's not necessary to support locale on such places. It causes a huge overhead and even fails sometimes * [include/oleauto.h][include/winerror.h] Added some ole-related constants. * [misc/shell.c] SHELL32_DllGetClassObject, SHGetSpecialFolderLocation, SHGetPathFromIDList improved the stubs * [ole/folders.c] IShellFolder* functions rewrote the stubs so don't crash and give something sensible back, started implementation of. * [ole/typelib.c][relay32/oleaut32.spec] LoadTypeLib32, RegisterTypeLib stub. * [ole/ole2nls.c] Fixed a buffer overrun in CompareString32A. Test for a bad pointer in LCMapString32A (happens in winhlp32 while building a index for searching). * [relay32/oleaut32.spec] [ole/typelib.c] Added stub for LoadTypeLib (ole32) to make excel95 happy. Tue Jun 23 22:47:09 1998 Alex Priem <alexp@sci.kun.nl> * [files/profile.c] [relay32/kernel32.spec] Added WritePrivateProfileStructA, GetPrivateProfileStructA, GetPrivateProfileSectionNames16. Tue Jun 23 01:34:43 1998 Pascal Cuoq <pcuoq@ens-lyon.fr> * [ole/ole2nls.c] GetStringTypeEx32A: Implemented CT_CTYPE2 and CT_CTYPE3 cases. LCMapString32A: Map final '\0' for '\0'-terminated strings. * [misc/shellord.c] [files/profile.c] [graphics/driver.c] [loader/module.c] [msdos/int21.c] [windows/driver.c] [files/drive.c] Changed lstrcmpi32A -> strcasecmp. Should be OK in these places. Sat Jun 20 23:40:00 1998 Bertho Stultiens <bertho@akhphd.au.dk> * [tools/wrc/] Wrc version 1.0.2 (20-Jun-1998). Please revert to the file tools/wrc/CHANGES for details. Sat Jun 20 14:58:00 1998 Marcel Baur <mbaur@g26.ethz.ch> * [ole/ole2nls.c] [ole/nls/*] Added the first 57 nls files, most are not yet complete. Wed Jun 17 11:16:54 1998 David Luyer <luyer@ucs.uwa.edu.au> * [relay32/relay386.c] [if1632/relay.c] Move debug_relay_(include|exclude)_list handling into seperate function RELAY_ShowDebugmsgsRelay(). Include checking of this for 16 bit calls (originally only 32-bit calls). * [relay32/snoop.c] [misc/main.c] Add debug_snoop_(include|exclude)_list as per the relay stuff. Fix typo and add information on -debugmsg +/-relay=... in help on -debugmsg. Refer to availability of snoop too. Tue Jun 10 22:00:18 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de> * [controls/header.c][include/header.h][include/commctrl.h] Added owner draw support. * [windows/nonclient.c][windows/sysmetics.c] Fixed menu bar height for Win95 look. Split NC_AdjustRect95() into NC_AdjustRectOuter95() and NC_AdjustRectInner95 to fix a menu bar bug. Improved Win95 look. * [controls/progress.c] Improved drawing code. Borders will be drawn by non-client code. * [controls/updown.c] Changed memory allocation and fixed some bugs. * [controls/toolbar.c] Fixed TB_BUTTONSTRUCTSIZE bug in MFC programs. Several improvements. * [misc/shell.c] Added stub for BrowseForFoldersA(). * [misc/shellord.c] Added stub for SHELL32_147(). * [controls/comctl32undoc.c] Minor changes. * [documentation/common_controls] New File: Documentation about development status, undocumented features and functions of the common controls.
714 lines
20 KiB
C
714 lines
20 KiB
C
/*
|
|
* NT basis DLL
|
|
*
|
|
* Copyright 1996 Marcus Meissner
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
#include <ctype.h>
|
|
#include <math.h>
|
|
#include "win.h"
|
|
#include "windows.h"
|
|
#include "winnls.h"
|
|
#include "ntdll.h"
|
|
#include "heap.h"
|
|
#include "debug.h"
|
|
#include "module.h"
|
|
#include "heap.h"
|
|
#include "debugstr.h"
|
|
|
|
/**************************************************************************
|
|
* RtlLengthRequiredSid [NTDLL]
|
|
*/
|
|
DWORD WINAPI RtlLengthRequiredSid(DWORD nrofsubauths)
|
|
{
|
|
return sizeof(DWORD)*nrofsubauths+sizeof(SID);
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlLengthSid [NTDLL]
|
|
*/
|
|
DWORD WINAPI RtlLengthSid(LPSID sid)
|
|
{
|
|
return sizeof(DWORD)*sid->SubAuthorityCount+sizeof(SID);
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlCreateAcl [NTDLL]
|
|
*
|
|
* NOTES
|
|
* This should return NTSTATUS
|
|
*/
|
|
DWORD WINAPI RtlCreateAcl(LPACL acl,DWORD size,DWORD rev)
|
|
{
|
|
if (rev!=ACL_REVISION)
|
|
return STATUS_INVALID_PARAMETER;
|
|
if (size<sizeof(ACL))
|
|
return STATUS_BUFFER_TOO_SMALL;
|
|
if (size>0xFFFF)
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
memset(acl,'\0',sizeof(ACL));
|
|
acl->AclRevision = rev;
|
|
acl->AclSize = size;
|
|
acl->AceCount = 0;
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlFirstFreeAce [NTDLL]
|
|
* looks for the AceCount+1 ACE, and if it is still within the alloced
|
|
* ACL, return a pointer to it
|
|
*/
|
|
BOOL32 WINAPI RtlFirstFreeAce(LPACL acl,LPACE_HEADER *x)
|
|
{
|
|
LPACE_HEADER ace;
|
|
int i;
|
|
|
|
*x = 0;
|
|
ace = (LPACE_HEADER)(acl+1);
|
|
for (i=0;i<acl->AceCount;i++) {
|
|
if ((DWORD)ace>=(((DWORD)acl)+acl->AclSize))
|
|
return 0;
|
|
ace = (LPACE_HEADER)(((BYTE*)ace)+ace->AceSize);
|
|
}
|
|
if ((DWORD)ace>=(((DWORD)acl)+acl->AclSize))
|
|
return 0;
|
|
*x = ace;
|
|
return 1;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlAddAce [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlAddAce(LPACL acl,DWORD rev,DWORD xnrofaces,
|
|
LPACE_HEADER acestart,DWORD acelen)
|
|
{
|
|
LPACE_HEADER ace,targetace;
|
|
int nrofaces;
|
|
|
|
if (acl->AclRevision != ACL_REVISION)
|
|
return STATUS_INVALID_PARAMETER;
|
|
if (!RtlFirstFreeAce(acl,&targetace))
|
|
return STATUS_INVALID_PARAMETER;
|
|
nrofaces=0;ace=acestart;
|
|
while (((DWORD)ace-(DWORD)acestart)<acelen) {
|
|
nrofaces++;
|
|
ace = (LPACE_HEADER)(((BYTE*)ace)+ace->AceSize);
|
|
}
|
|
if ((DWORD)targetace+acelen>(DWORD)acl+acl->AclSize) /* too much aces */
|
|
return STATUS_INVALID_PARAMETER;
|
|
memcpy((LPBYTE)targetace,acestart,acelen);
|
|
acl->AceCount+=nrofaces;
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlCreateSecurityDescriptor [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlCreateSecurityDescriptor(LPSECURITY_DESCRIPTOR lpsd,DWORD rev)
|
|
{
|
|
if (rev!=SECURITY_DESCRIPTOR_REVISION)
|
|
return STATUS_UNKNOWN_REVISION;
|
|
memset(lpsd,'\0',sizeof(*lpsd));
|
|
lpsd->Revision = SECURITY_DESCRIPTOR_REVISION;
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlSetDaclSecurityDescriptor [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlSetDaclSecurityDescriptor ( LPSECURITY_DESCRIPTOR lpsd,BOOL32 daclpresent,LPACL dacl,BOOL32 dacldefaulted )
|
|
{
|
|
if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
|
|
return STATUS_UNKNOWN_REVISION;
|
|
if (lpsd->Control & SE_SELF_RELATIVE)
|
|
return STATUS_INVALID_SECURITY_DESCR;
|
|
if (!daclpresent) {
|
|
lpsd->Control &= ~SE_DACL_PRESENT;
|
|
return 0;
|
|
}
|
|
lpsd->Control |= SE_DACL_PRESENT;
|
|
lpsd->Dacl = dacl;
|
|
if (dacldefaulted)
|
|
lpsd->Control |= SE_DACL_DEFAULTED;
|
|
else
|
|
lpsd->Control &= ~SE_DACL_DEFAULTED;
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlSetSaclSecurityDescriptor [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlSetSaclSecurityDescriptor (
|
|
LPSECURITY_DESCRIPTOR lpsd,BOOL32 saclpresent,LPACL sacl,BOOL32 sacldefaulted
|
|
)
|
|
{
|
|
if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
|
|
return STATUS_UNKNOWN_REVISION;
|
|
if (lpsd->Control & SE_SELF_RELATIVE)
|
|
return STATUS_INVALID_SECURITY_DESCR;
|
|
if (!saclpresent) {
|
|
lpsd->Control &= ~SE_SACL_PRESENT;
|
|
return 0;
|
|
}
|
|
lpsd->Control |= SE_SACL_PRESENT;
|
|
lpsd->Sacl = sacl;
|
|
if (sacldefaulted)
|
|
lpsd->Control |= SE_SACL_DEFAULTED;
|
|
else
|
|
lpsd->Control &= ~SE_SACL_DEFAULTED;
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlSetOwnerSecurityDescriptor [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlSetOwnerSecurityDescriptor (LPSECURITY_DESCRIPTOR lpsd,LPSID owner,BOOL32 ownerdefaulted)
|
|
{
|
|
if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
|
|
return STATUS_UNKNOWN_REVISION;
|
|
if (lpsd->Control & SE_SELF_RELATIVE)
|
|
return STATUS_INVALID_SECURITY_DESCR;
|
|
|
|
lpsd->Owner = owner;
|
|
if (ownerdefaulted)
|
|
lpsd->Control |= SE_OWNER_DEFAULTED;
|
|
else
|
|
lpsd->Control &= ~SE_OWNER_DEFAULTED;
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlSetOwnerSecurityDescriptor [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlSetGroupSecurityDescriptor (LPSECURITY_DESCRIPTOR lpsd,LPSID group,BOOL32 groupdefaulted)
|
|
{
|
|
if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
|
|
return STATUS_UNKNOWN_REVISION;
|
|
if (lpsd->Control & SE_SELF_RELATIVE)
|
|
return STATUS_INVALID_SECURITY_DESCR;
|
|
|
|
lpsd->Group = group;
|
|
if (groupdefaulted)
|
|
lpsd->Control |= SE_GROUP_DEFAULTED;
|
|
else
|
|
lpsd->Control &= ~SE_GROUP_DEFAULTED;
|
|
return 0;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
* RtlNormalizeProcessParams [NTDLL]
|
|
*/
|
|
LPVOID WINAPI RtlNormalizeProcessParams(LPVOID x)
|
|
{
|
|
FIXME(ntdll,"(%p), stub\n",x);
|
|
return x;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlInitializeSid [NTDLL]
|
|
*/
|
|
DWORD WINAPI RtlInitializeSid(LPSID lpsid,LPSID_IDENTIFIER_AUTHORITY lpsidauth,
|
|
DWORD c)
|
|
{
|
|
BYTE a = c&0xff;
|
|
|
|
if (a>=SID_MAX_SUB_AUTHORITIES)
|
|
return a;
|
|
lpsid->SubAuthorityCount = a;
|
|
lpsid->Revision = SID_REVISION;
|
|
memcpy(&(lpsid->IdentifierAuthority),lpsidauth,sizeof(SID_IDENTIFIER_AUTHORITY));
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlSubAuthoritySid [NTDLL]
|
|
*/
|
|
LPDWORD WINAPI RtlSubAuthoritySid(LPSID lpsid,DWORD nr)
|
|
{
|
|
return &(lpsid->SubAuthority[nr]);
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlSubAuthorityCountSid [NTDLL]
|
|
*/
|
|
LPBYTE WINAPI RtlSubAuthorityCountSid(LPSID lpsid)
|
|
{
|
|
return ((LPBYTE)lpsid)+1;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlCopySid [NTDLL]
|
|
*/
|
|
DWORD WINAPI RtlCopySid(DWORD len,LPSID to,LPSID from)
|
|
{
|
|
if (len<(from->SubAuthorityCount*4+8))
|
|
return STATUS_BUFFER_TOO_SMALL;
|
|
memmove(to,from,from->SubAuthorityCount*4+8);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlAnsiStringToUnicodeString [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlAnsiStringToUnicodeString(LPUNICODE_STRING uni,LPANSI_STRING ansi,BOOL32 doalloc)
|
|
{
|
|
DWORD unilen = (ansi->Length+1)*sizeof(WCHAR);
|
|
|
|
if (unilen>0xFFFF)
|
|
return STATUS_INVALID_PARAMETER_2;
|
|
uni->Length = unilen;
|
|
if (doalloc) {
|
|
uni->MaximumLength = unilen;
|
|
uni->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,unilen);
|
|
if (!uni->Buffer)
|
|
return STATUS_NO_MEMORY;
|
|
}
|
|
if (unilen>uni->MaximumLength)
|
|
return STATUS_BUFFER_OVERFLOW;
|
|
lstrcpynAtoW(uni->Buffer,ansi->Buffer,unilen/2);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlOemStringToUnicodeString [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlOemStringToUnicodeString(LPUNICODE_STRING uni,LPSTRING ansi,BOOL32 doalloc)
|
|
{
|
|
DWORD unilen = (ansi->Length+1)*sizeof(WCHAR);
|
|
|
|
if (unilen>0xFFFF)
|
|
return STATUS_INVALID_PARAMETER_2;
|
|
uni->Length = unilen;
|
|
if (doalloc) {
|
|
uni->MaximumLength = unilen;
|
|
uni->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,unilen);
|
|
if (!uni->Buffer)
|
|
return STATUS_NO_MEMORY;
|
|
}
|
|
if (unilen>uni->MaximumLength)
|
|
return STATUS_BUFFER_OVERFLOW;
|
|
lstrcpynAtoW(uni->Buffer,ansi->Buffer,unilen/2);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
/**************************************************************************
|
|
* RtlMultiByteToUnicodeN [NTDLL]
|
|
* FIXME: multibyte support
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlMultiByteToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen)
|
|
{
|
|
DWORD len;
|
|
LPWSTR x;
|
|
|
|
len = oemlen;
|
|
if (unilen/2 < len)
|
|
len = unilen/2;
|
|
x=(LPWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(len+1)*sizeof(WCHAR));
|
|
lstrcpynAtoW(x,oemstr,len+1);
|
|
memcpy(unistr,x,len*2);
|
|
if (reslen) *reslen = len*2;
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlOemToUnicodeN [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlOemToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen)
|
|
{
|
|
DWORD len;
|
|
LPWSTR x;
|
|
|
|
len = oemlen;
|
|
if (unilen/2 < len)
|
|
len = unilen/2;
|
|
x=(LPWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(len+1)*sizeof(WCHAR));
|
|
lstrcpynAtoW(x,oemstr,len+1);
|
|
memcpy(unistr,x,len*2);
|
|
if (reslen) *reslen = len*2;
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlInitAnsiString [NTDLL]
|
|
*/
|
|
VOID WINAPI RtlInitAnsiString(LPANSI_STRING target,LPCSTR source)
|
|
{
|
|
target->Length = target->MaximumLength = 0;
|
|
target->Buffer = (LPSTR)source;
|
|
if (!source)
|
|
return;
|
|
target->Length = lstrlen32A(target->Buffer);
|
|
target->MaximumLength = target->Length+1;
|
|
}
|
|
/**************************************************************************
|
|
* RtlInitString [NTDLL]
|
|
*/
|
|
VOID WINAPI RtlInitString(LPSTRING target,LPCSTR source)
|
|
{
|
|
target->Length = target->MaximumLength = 0;
|
|
target->Buffer = (LPSTR)source;
|
|
if (!source)
|
|
return;
|
|
target->Length = lstrlen32A(target->Buffer);
|
|
target->MaximumLength = target->Length+1;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlInitUnicodeString [NTDLL]
|
|
*/
|
|
VOID WINAPI RtlInitUnicodeString(LPUNICODE_STRING target,LPCWSTR source)
|
|
{
|
|
target->Length = target->MaximumLength = 0;
|
|
target->Buffer = (LPWSTR)source;
|
|
if (!source)
|
|
return;
|
|
target->Length = lstrlen32W(target->Buffer)*2;
|
|
target->MaximumLength = target->Length+2;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlFreeUnicodeString [NTDLL]
|
|
*/
|
|
VOID WINAPI RtlFreeUnicodeString(LPUNICODE_STRING str)
|
|
{
|
|
if (str->Buffer)
|
|
HeapFree(GetProcessHeap(),0,str->Buffer);
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlUnicodeToOemN [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlUnicodeToOemN(LPSTR oemstr,DWORD oemlen,LPDWORD reslen,LPWSTR unistr,DWORD unilen)
|
|
{
|
|
DWORD len;
|
|
LPSTR x;
|
|
|
|
len = oemlen;
|
|
if (unilen/2 < len)
|
|
len = unilen/2;
|
|
x=(LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,len+1);
|
|
lstrcpynWtoA(x,unistr,len+1);
|
|
memcpy(oemstr,x,len);
|
|
if (reslen) *reslen = len;
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlUnicodeStringToOemString [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlUnicodeStringToOemString(LPANSI_STRING oem,LPUNICODE_STRING uni,BOOL32 alloc)
|
|
{
|
|
if (alloc) {
|
|
oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,uni->Length/2)+1;
|
|
oem->MaximumLength = uni->Length/2+1;
|
|
}
|
|
oem->Length = uni->Length/2;
|
|
lstrcpynWtoA(oem->Buffer,uni->Buffer,uni->Length/2+1);
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlUnicodeStringToAnsiString [NTDLL]
|
|
*/
|
|
DWORD /* NTSTATUS */ WINAPI RtlUnicodeStringToAnsiString(LPUNICODE_STRING uni,LPANSI_STRING oem,BOOL32 alloc)
|
|
{
|
|
if (alloc) {
|
|
oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,uni->Length/2)+1;
|
|
oem->MaximumLength = uni->Length/2+1;
|
|
}
|
|
oem->Length = uni->Length/2;
|
|
lstrcpynWtoA(oem->Buffer,uni->Buffer,uni->Length/2+1);
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlNtStatusToDosErro [NTDLL]
|
|
*/
|
|
DWORD WINAPI RtlNtStatusToDosError(DWORD error)
|
|
{
|
|
FIXME(ntdll, "(%lx): map STATUS_ to ERROR_\n",error);
|
|
return error;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlGetNtProductType [NTDLL]
|
|
*/
|
|
DWORD WINAPI RtlGetNtProductType(LPVOID x)
|
|
{
|
|
FIXME(ntdll, "(%p): stub\n", x);
|
|
return 0;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlUpcaseUnicodeString [NTDLL]
|
|
*/
|
|
DWORD WINAPI RtlUpcaseUnicodeString(LPUNICODE_STRING dest,LPUNICODE_STRING src,BOOL32 doalloc)
|
|
{
|
|
LPWSTR s,t;
|
|
DWORD i,len;
|
|
|
|
len = src->Length;
|
|
if (doalloc) {
|
|
dest->MaximumLength = len;
|
|
dest->Buffer = (LPWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,len);
|
|
if (!dest->Buffer)
|
|
return STATUS_NO_MEMORY;
|
|
|
|
}
|
|
if (dest->MaximumLength < len)
|
|
return STATUS_BUFFER_OVERFLOW;
|
|
s=dest->Buffer;t=src->Buffer;
|
|
/* len is in bytes */
|
|
for (i=0;i<len/2;i++)
|
|
s[i] = towupper(t[i]);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlxOemStringToUnicodeSize [NTDLL]
|
|
*/
|
|
UINT32 WINAPI RtlxOemStringToUnicodeSize(LPSTRING str)
|
|
{
|
|
return str->Length*2+2;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlxAnsiStringToUnicodeSize [NTDLL]
|
|
*/
|
|
UINT32 WINAPI RtlxAnsiStringToUnicodeSize(LPANSI_STRING str)
|
|
{
|
|
return str->Length*2+2;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlIsTextUnicode [NTDLL]
|
|
*
|
|
* Apply various feeble heuristics to guess whether
|
|
* the text buffer contains Unicode.
|
|
* FIXME: should implement more tests.
|
|
*/
|
|
DWORD WINAPI RtlIsTextUnicode(LPVOID buf, DWORD len, DWORD *pf)
|
|
{
|
|
LPWSTR s = buf;
|
|
DWORD flags = -1, out_flags = 0;
|
|
|
|
if (!len)
|
|
goto out;
|
|
if (pf)
|
|
flags = *pf;
|
|
/*
|
|
* Apply various tests to the text string. According to the
|
|
* docs, each test "passed" sets the corresponding flag in
|
|
* the output flags. But some of the tests are mutually
|
|
* exclusive, so I don't see how you could pass all tests ...
|
|
*/
|
|
|
|
/* Check for an odd length ... pass if even. */
|
|
if (!(len & 1))
|
|
out_flags |= IS_TEXT_UNICODE_ODD_LENGTH;
|
|
|
|
/* Check for the special unicode marker byte. */
|
|
if (*s == 0xFEFF)
|
|
out_flags |= IS_TEXT_UNICODE_SIGNATURE;
|
|
|
|
/*
|
|
* Check whether the string passed all of the tests.
|
|
*/
|
|
flags &= ITU_IMPLEMENTED_TESTS;
|
|
if ((out_flags & flags) != flags)
|
|
len = 0;
|
|
out:
|
|
if (pf)
|
|
*pf = out_flags;
|
|
return len;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* RtlDosPathNameToNtPathName_U [NTDLL]
|
|
*
|
|
* FIXME: convert to UNC or whatever is expected here
|
|
*/
|
|
BOOL32 WINAPI RtlDosPathNameToNtPathName_U(
|
|
LPWSTR from,LPUNICODE_STRING us,DWORD x2,DWORD x3)
|
|
{
|
|
LPSTR fromA = HEAP_strdupWtoA(GetProcessHeap(),0,from);
|
|
|
|
FIXME(ntdll,"(%s,%p,%08lx,%08lx)\n",fromA,us,x2,x3);
|
|
if (us)
|
|
RtlInitUnicodeString(us,HEAP_strdupW(GetProcessHeap(),0,from));
|
|
return TRUE;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* NtOpenFile [NTDLL]
|
|
*/
|
|
DWORD WINAPI NtOpenFile(DWORD x1,DWORD flags,DWORD x3,DWORD x4,DWORD alignment,DWORD x6)
|
|
{
|
|
FIXME(ntdll,"(%08lx,%08lx,%08lx,%08lx,%08lx,%08lx): stub\n",
|
|
x1,flags,x3,x4,alignment,x6);
|
|
/* returns file io completion status */
|
|
return 0;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
* NTDLL_chkstk (NTDLL.862)
|
|
*
|
|
* NOTES
|
|
* Should this be WINAPI?
|
|
*/
|
|
void NTDLL_chkstk(void)
|
|
{
|
|
/* FIXME: should subtract %eax bytes from stack pointer */
|
|
FIXME(ntdll, "(void): stub\n");
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
* NtOpenDirectoryObject [NTDLL.124]
|
|
*/
|
|
DWORD WINAPI NtOpenDirectoryObject(DWORD x1,DWORD x2,DWORD x3)
|
|
{
|
|
FIXME(ntdll,"(%lx,%lx,%lx): stub\n",x1,x2,x3);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
* NtQueryDirectoryObject [NTDLL.149]
|
|
*/
|
|
DWORD WINAPI NtQueryDirectoryObject( DWORD x1, DWORD x2, DWORD x3, DWORD x4,
|
|
DWORD x5, DWORD x6, DWORD x7 )
|
|
{
|
|
FIXME(ntdll,"(%lx,%lx,%lx,%lx,%lx,%lx,%lx): stub\n",x1,x2,x3,x4,x5,x6,x7);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
* RtlFreeAnsiString [NTDLL.373]
|
|
*/
|
|
VOID WINAPI RtlFreeAnsiString(LPANSI_STRING AnsiString)
|
|
{
|
|
if( AnsiString->Buffer )
|
|
HeapFree( GetProcessHeap(),0,AnsiString->Buffer );
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
* NtQuerySystemInformation [NTDLL.168]
|
|
*/
|
|
DWORD WINAPI NtQuerySystemInformation( DWORD x1, DWORD x2, DWORD x3, DWORD x4 )
|
|
{
|
|
FIXME(ntdll,"(%lx,%lx,%lx,%lx): stub\n",x1,x2,x3,x4);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
* NtQueryObject [NTDLL.161]
|
|
*/
|
|
DWORD WINAPI NtQueryObject( DWORD x1, DWORD x2 ,DWORD x3, DWORD x4, DWORD x5 )
|
|
{
|
|
FIXME(ntdll,"(%lx,%lx,%lx,%lx,%lx): stub\n",x1,x2,x3,x4,x5);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
* RtlTimeToElapsedTimeFields [NTDLL.502]
|
|
*/
|
|
DWORD WINAPI RtlTimeToElapsedTimeFields( DWORD x1, DWORD x2 )
|
|
{
|
|
FIXME(ntdll,"(%lx,%lx): stub\n",x1,x2);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
* NtSetInformationProcess [NTDLL.207]
|
|
*/
|
|
DWORD WINAPI NtSetInformationProcess( DWORD x1, DWORD x2, DWORD x3, DWORD x4 )
|
|
{
|
|
FIXME(ntdll,"(%lx,%lx,%lx,%lx): stub\n",x1,x2,x3,x4);
|
|
return 0;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* NtFsControlFile [NTDLL.108]
|
|
*/
|
|
VOID WINAPI NtFsControlFile(VOID)
|
|
{
|
|
FIXME(ntdll,"(void): stub\n");
|
|
}
|
|
|
|
/******************************************************************************
|
|
* RtlExtendedLargeIntegerDivide [NTDLL.359]
|
|
*/
|
|
INT32 WINAPI RtlExtendedLargeIntegerDivide(
|
|
LARGE_INTEGER dividend,
|
|
DWORD divisor,
|
|
LPDWORD rest
|
|
) {
|
|
#if SIZEOF_LONG_LONG==8
|
|
long long x1 = *(long long*)÷nd;
|
|
|
|
if (*rest)
|
|
*rest = x1 % divisor;
|
|
return x1/divisor;
|
|
#else
|
|
FIXME(ntdll,"((%d<<32)+%d,%d,%p), implement this using normal integer arithmetic!\n",dividend.HighPart,dividend.LowPart,divisor,rest);
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
/******************************************************************************
|
|
* RtlExtendedLargeIntegerMultiply [NTDLL.359]
|
|
* Note: This even works, since gcc returns 64bit values in eax/edx just like
|
|
* the caller expects. However... The relay code won't grok this I think.
|
|
*/
|
|
long long /*LARGE_INTEGER*/ WINAPI RtlExtendedIntegerMultiply(
|
|
LARGE_INTEGER factor1,INT32 factor2
|
|
) {
|
|
#if SIZEOF_LONG_LONG==8
|
|
return (*(long long*)&factor1)*factor2;
|
|
#else
|
|
FIXME(ntdll,"((%d<<32)+%d,%ld), implement this using normal integer arithmetic!\n",factor1.HighPart,factor1.LowPart,factor2);
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
DWORD WINAPI NtOpenKey(DWORD x1,DWORD x2,DWORD x3) {
|
|
FIXME(ntdll,"(0x%08lx(%s),0x%08lx,0x%08lx),stub!\n",x1,
|
|
debugstr_w(*(LPWSTR*)x1),x2,x3);
|
|
/* hmm... */
|
|
return RegOpenKey32W(x2,*(LPWSTR*)x1,x3);
|
|
}
|
|
|
|
DWORD WINAPI NtQueryValueKey(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6) {
|
|
FIXME(ntdll,"(%08lx,%08lx,%08lx,%08lx,%08lx,%08lx),stub!\n",
|
|
x1,x2,x3,x4,x5,x6
|
|
);
|
|
return 0;
|
|
}
|
|
|
|
DWORD WINAPI NtQueryTimerResolution(DWORD x1,DWORD x2,DWORD x3) {
|
|
FIXME(ntdll,"(0x%08lx,0x%08lx,0x%08lx), stub!\n",x1,x2,x3);
|
|
return 1;
|
|
}
|
|
|
|
DWORD WINAPI NtClose(DWORD x1) {
|
|
FIXME(ntdll,"(0x%08lx),stub!\n",x1);
|
|
return 1;
|
|
}
|
|
|
|
DWORD WINAPI NtQueryInformationProcess(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5) {
|
|
FIXME(ntdll,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub!\n",
|
|
x1,x2,x3,x4,x5
|
|
);
|
|
return 0;
|
|
}
|