mirror of
https://github.com/reactos/wine.git
synced 2025-02-27 08:15:36 +00:00

Fri Sep 11 13:14:35 1998 Andreas Mohr <100.30936@germany.net> * [files/file.c] [include/file.h] Fixed SetFilePointer to allow negative positions as in DOS. * [graphics/ddraw.c] Added some methods to IDirect3D. * [ole/compobj.c] [if1632/compobj.spec] Added/implemented CoCreateStandardMalloc16, CoGetClassObject, CoCreateInstance, LookupETask, SetETask, CoGetState16. * [loader/task.c] MakeProcInstance: return 0 if func == NULL. * [*/*] [tools/winapi-check] Added zillions of missing WINAPI's and __cdecl's. (oops, several caused by myself) Wrote script for automated checking. * [if1632/compobj.spec] Many stub names. * [misc/ddeml.c] [ole/compobj.c] Some stubs. Tue Sep 9 21:36:48 1998 Anders Carlsson <anders.carlsson@linux.nu> * [dlls/comctl32/Makefile.in] [dlls/comctl32/commctrl.c] [dlls/comctl32/tab.c] [include/commctrl.h] [include/tab.h] Added preliminary tab control support. Sat Sep 5 16:27:20 1998 Huw D M Davies <daviesh@abacus.physics.ox.ac.uk> * [graphics/psdrv/*] More changes to the PostScript driver: Implemented pens and solid brushes. Colour/greyscale for fonts, pens and brushes. To get coloured output you need to have *ColorDevice set to true in your PPD, otherwise you'll get greyscale. Landscape mode now works, as does non-A4 page sizes. Encoding of fonts to ANSI is better, Symbol works again. * [objects/dc.c] [include/gdi.h] [*/*] Moved dc->w.{text,background}Pixel to X11DRV_PDEVICE where they belong. Sat Sep 5 05:12:09 1998 Ove Kaaven <ovek@arcticnet.no> * [include/dosexe.h] [include/miscemu.h] [include/msdos.h] [loader/dos/dosvm.c] [loader/dos/module.c] [msdos/dpmi.c] [msdos/int2f.c] [msdos/interrupts.c] Fixed portability. Adapted some code to make it easier to integrate the DOS subsystem with the DPMI subsystem, made the DPMI simulated real-mode interrupts be handled the V86 way. Added support for .COM files. Made int2f DPMI check fail, to avoid pkunzip crashing in attempting to use DPMI. Generally moved stuff around a little. It is now technically possible to load several DOS programs into the same memory space. Not tested, though. Fri Sep 4 21:40:45 1998 Marcus Meissner <marcus@jet.franken.de> * [if1632/kernel.spec] Changed 500-53x stubnames accordingly to nt3.51 krnl386.exe. * [win32/except.c] Fixed one bad program behaviour, (deleting SEH while in first walk). RtlUnwind is broken too I think (it should unwind on success, not while walking the exception chain). * [ole/ole2nls.c] Get*DefaultLCID returns 0x400|id. expected by one application. * [if1632/snoop.c] Handle non-standard SP returns more graceful. * [windows/class.c] hinstances are mostly irrelevant for win32. * [memory/string.c] [misc/registry.c] lstrcmpi32W: use toupper for characters < 0x100. (speedup hack for registry.c) Some small speedup hacks for registry.c Thu Sep 3 20:40:16 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de> * [Makefile.in][configure][configure.in][dlls/Makefile.in] [dlls/comctl32/Makefile.in] Created dlls/comctl32 and moved the common controls stuff to it. * [misc/version.c] Removed COMCTL32_DllGetVersion. The fixed function is part of the common controls stuff. * [dlls/comctl32/*.c][include/commctrl.h] Added structure size tests. * [dlls/comctl32/toolbar.c] Fixed a bug in TOOLBAR_GetMaxWidth(). * [dlls/comctl32/animate.c][include/animate.h] [dlls/comctl32/comboex.c][include/comboex.h] [dlls/comctl32/hotkey.c][include/hotkey.h] [dlls/comctl32/listview.c][include/listview.h] [dlls/comctl32/commctrl.c][include/commctrl.h] New files. Added Animation, ComboBoxEx, Hotkey and Listview control dummies. * [dlls/comctl32/tooltips.c] Fixed a display bug and font selection. * [dlls/comctl32/comctl32undoc.c][include/commctrl.h] Added missing DPA functions. Fixed bugs and published the function prototypes. * [documentation/common_controls] Updated. Wed Sep 2 15:43:45 1998 Patrik Stridvall <ps@leissner.se> * [AUTHORS] [include/authors.h] Added myself as a Wine author. * [memory/virtual.c] [objects/dc.c] Fixed runtime errors for Solaris. * [misc/ddeml.c] [objects/gdiobj.c] Minor fixes. * [win32/device.c] Added stubs for IFSMgr VxDCall and a partial implementation of IFSMgr DeviceIo. * [relay32/Makefile.in] [relay32/builtin32.c] [relay32/imm32.spec] [relay32/msnet32.spec] [relay32/oledlg.spec] Added new spec files for IMM32.DLL, MSNET32.DLL, OLEDLG.DLL. * [misc/Makefile.in] [misc/imm.c] [include/imm.h] Added news files for implementation of IMM32.DLL. All functions return 0 as is correct for all Western Languages. * [ole/Makefile.in] [ole/oledlg.c] [include/oledlg.h] Added new files for implementation of OLEDLG.DLL. Added stubs with FIXME:s for all functions. Wed Sep 2 10:50:00 1998 Juergen Schmied <juergen.schmied@metronet.de> * [dlls/shell32/contmenu.c][dlls/shell32/shellole.c] [dlls/shell32/shlfolder.c][dlls/shell32/shlview.c] [documentation/shell32][include/shell.h] Clean up, bugfixes. * [dlls/shell32/enumidlist.c] Fileattributes implemented. * [dlls/shell32/pidl.c] Class pidlmgr splited into functions, structures changed, some functions rewritten. * [dlls/shell32/shell32_main.c] Small changes and bugfixes SHGetFileInfoA, SHGetSpecialFolderLocation. * [dlls/shell32/shellord.c][relay32/shell32.spec] Parameter documented, implemented SHCloneSpecialIDList. Stub improved ShellExecuteEx32A. New stubs SHFind_InitMenuPopup, FileMenu_InitMenuPopup, FileMenu_Create, FileMenu_TrackPopupMenuEx, SHWinHelp, SHRunConrolPanel, DAD_ShowDragImage, FileMenu_Destroy, SHGetDataFromIDListA, SHFileOperationA. * [include/winnls.h][include/ole2nls.c] TIME_FORCE24HOURFORMAT, TIME_NOTIMEMARKER implemented in OLE_GetFormatA, GetTimeFormat32A. * [win32/code_page.c] WideCharToMultiByte: parameter checking and returning of strlen implemented. * [windows/keyboard.c][windows/defwnd.c] Debug messages added. * [windows/win.c] WIN_SetWindowLong GWL_STYLE and GWL_EXSTYLE implemented. * [controls/menu.c] Missing line added. * [include/winerror.h] Macros for SUCCEEDED and FAILED added. Mon Aug 31 00:55:31 1998 Ulrich Weigand <weigand@informatik.uni-erlangen.de> * [loader/module.c] Bugfix: LoadModule16 should *not* call LoadModule32. * [files/dos_fs.c] Bugfix: don't crash if given directory doesn't exist. Sat Aug 29 15:00:49 1998 Turchanov Sergey <turchanov@usa.net> * [include/mmsystem.h][multimedia/mmsystem.c][relay32/winmm.spec] Almost completed implementation of [snd]PlaySound (except flags SND_ALIAS_ID and SND_APPLICATION). * [if1632/user.spec][windows/winpos.c] Added SetWindowRgn16 stub. Sat Aug 29 02:53:31 1998 Alexander Lukyanov <lav@long.yar.ru> * [files/drive.c] GetDriveType32A: return DRIVE_DOESNOTEXIST in case of non existent drive. * [msdos/int21.c] INT21_FindFirstFCB: check drive validity to prevent oops. * [win32/file.c] CreateFile32A: duplicate STD_{INPUT,OUTPUT}_HANDLE. * [files/dos_fs.c] Make DOSFS_OpenDir treat "" as "/". DOSFS_OpenDevice: duplicate STD_{INPUT,OUTPUT}_HANDLE. * [windows/dialog.c] GetNextDlgTabItem32: use last/first item instead of first/last when hwndCtrl==0. This fixes initial focus. Sat Aug 29 02:46:32 1998 Adrian Harvey <adrian@select.com.au> * [include/process.h] [include/process.c] Renamed PROCESS_SELF to CURRENT_PROCESS_PSEUDOHANDLE in line with thread constant, and Win32 documentation (which calls it a pseudohandle.) Made GetCurrentProcess actually use this constant instead of the value. * [include/process.h] [include/thread.h] [scheduler/thread.c] [scheduler/process.c] [scheduler/handle.c] Modify HANDLE_GetObjPtr to understand about CURRENT_THREAD_PSEUDOHANDLE and CURRENT_PROCESS_PSEUDOHANDLE. This allows DuplicateHandle to do the correct thing with these handles. Removed now duplicate functionality from THREAD_GetPtr and PROCESS_GetPtr. * [loader/ne/segment.c] Fixed two places where HFILE32s were being created and passed to 16-bit code. This should unbreak NE self-loading code. Added two casts to remove compile time warnings. Fri Aug 28 21:04:13 1998 Joseph Pranevich <knight@baltimore.wwaves.com> * [msdos/dosmem.c] [msdos/int2f.c] Added beginnings of DOS error table. * [msdos/int1a.c] Stub for subfunction 0xb0. * [msdos/int10.c] [loader/dos/dosvm.c] INT 10 support completely rewritten and lots of debugging added. Now, DOS apps that use INT 10 to write to the screen will work. (Beyond Zork does, at least. Somewhat.) * [include/miscemu.h] [msdos/dosmem.c] [msdos/int21.c] Another shot at getting MS's generic error message facility right. * [msdos/int21.c] Command.Com wanted to set its own PSP address. I let it. Wed Aug 26 12:26:20 1998 Matthew Toseland <Matthew.Toseland@btinternet.com> * [include/file.h] [misc/lzexpand.c] Fixed LZCopy16 by fixing HFILE16/HFILE32 convertor macros so don't convert lzw handles. Tue Aug 25 22:22:55 1998 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de> * [misc/registry.c] In RegEnumvalue, ivalue == 0 is a legal request and should return the first entry. * [msdos/int21.c] Add handling for Int21-48/49 in Win16. Makes blinker demo work. * [windows/winproc.c] Add Msg32A<->Msg32W translation for LB_ADDSTRING. Tue Aug 25 21:03:31 1998 Kristian Nielsen <kristian.nielsen@risoe.dk> * [windows/win.c] Fix for SetParent(): MS Windows 3.11 does not clear the WS_CHILD flag when a child window is reparented to the desktop window. Mon Aug 24 20:55:22 1998 Berend Reitsma <berend at asset-control dot com> * [controls/menu.c] Menus created with SetMenuItemInfo and InsertMenuItem should work now. Sun Aug 23 23:23:23 1998 Alex Korobka <korobka@ams.sunysb.edu> * [controls/combo.c] Added CB_GETITEMHEIGHT. * [windows/winpos.c] WM_NCHITTEST, SWP_FRAMECHANGED bugfixes. Sat Aug 22 21:15:29 1998 Alex Priem <alexp@sci.kun.nl> * [files/profile.c] [include/windows.h] Added GetPrivateProfileSectionNames[AW],GetPrivateProfileSectionW, GetPrivateProfileStructW, GetProfileSectionW, WriteProfileSection[AW], WritePrivateProfileStructW.
732 lines
20 KiB
C
732 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)
|
|
*/
|
|
void WINAPI 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;
|
|
}
|
|
|
|
DWORD WINAPI RtlFormatCurrentUserKeyPath()
|
|
{
|
|
FIXME(ntdll,"(): stub\n");
|
|
return 1;
|
|
}
|