mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 05:37:44 +00:00
- Revert 49767 on Pierre's request, which reverted this:
- Added real implementation of SetLastError() (instead of forwarding to NTDLL) - Implemented BaseSetLastNTError() - Renamed Basep8BitStringToCachedUnicodeString() to Basep8BitStringToStaticUnicodeString() and sightly changed its implementation - Fixed implementation of LoadLibraryExA() & DisableThreadLibraryCalls() using those changes This is matching w2k3 implementation. This is of course a WIP. svn path=/trunk/; revision=50819
This commit is contained in:
parent
4638bf943c
commit
634966f644
|
@ -69,7 +69,6 @@
|
||||||
|
|
||||||
#define SetLastErrorByStatus(x) RtlSetLastWin32ErrorAndNtStatusFromNtStatus((x))
|
#define SetLastErrorByStatus(x) RtlSetLastWin32ErrorAndNtStatusFromNtStatus((x))
|
||||||
#define GetLastError() NtCurrentTeb()->LastErrorValue
|
#define GetLastError() NtCurrentTeb()->LastErrorValue
|
||||||
#define SetLastError(x) NtCurrentTeb()->LastErrorValue = (x)
|
|
||||||
|
|
||||||
typedef struct _CODEPAGE_ENTRY
|
typedef struct _CODEPAGE_ENTRY
|
||||||
{
|
{
|
||||||
|
@ -192,7 +191,7 @@ BasepAnsiStringToHeapUnicodeString(IN LPCSTR AnsiString,
|
||||||
|
|
||||||
PUNICODE_STRING
|
PUNICODE_STRING
|
||||||
WINAPI
|
WINAPI
|
||||||
Basep8BitStringToCachedUnicodeString(IN LPCSTR String);
|
Basep8BitStringToStaticUnicodeString(IN LPCSTR AnsiString);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
WINAPI
|
WINAPI
|
||||||
|
@ -225,3 +224,7 @@ GetDllLoadPath(LPCWSTR lpModule);
|
||||||
VOID
|
VOID
|
||||||
WINAPI
|
WINAPI
|
||||||
InitCommandLines(VOID);
|
InitCommandLines(VOID);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
BaseSetLastNTError(IN NTSTATUS Status);
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
@ stdcall BaseProcessInitPostImport() ; missing in Win 7
|
@ stdcall BaseProcessInitPostImport() ; missing in Win 7
|
||||||
@ stdcall BaseQueryModuleData(str str ptr ptr ptr) ;check
|
@ stdcall BaseQueryModuleData(str str ptr ptr ptr) ;check
|
||||||
;@ stdcall BaseThreadInitThunk ; Win 7
|
;@ stdcall BaseThreadInitThunk ; Win 7
|
||||||
;@ stdcall BaseSetLastNTError ; Win 7, not 64 bit
|
;@ stdcall BaseSetLastNTError ; Win 7, not 64 bit (present on w2k3 but not exported)
|
||||||
@ stdcall BaseUpdateAppcompatCache(long long long)
|
@ stdcall BaseUpdateAppcompatCache(long long long)
|
||||||
;@ stdcall BaseVerifyUnicodeString ; Win 7
|
;@ stdcall BaseVerifyUnicodeString ; Win 7
|
||||||
;@ stdcall Basep8BitStringToDynamicUnicodeString ; Win 7
|
;@ stdcall Basep8BitStringToDynamicUnicodeString ; Win 7
|
||||||
|
@ -1211,7 +1211,7 @@
|
||||||
@ stdcall SetHandleInformation(long long long)
|
@ stdcall SetHandleInformation(long long long)
|
||||||
@ stdcall SetInformationJobObject(long long ptr long)
|
@ stdcall SetInformationJobObject(long long ptr long)
|
||||||
@ stub SetLastConsoleEventActive ; missing in XP SP3
|
@ stub SetLastConsoleEventActive ; missing in XP SP3
|
||||||
@ stdcall SetLastError(long) ntdll.RtlSetLastWin32Error
|
@ stdcall SetLastError(long)
|
||||||
@ stub SetLocalPrimaryComputerNameA ; missing in XP SP3
|
@ stub SetLocalPrimaryComputerNameA ; missing in XP SP3
|
||||||
@ stub SetLocalPrimaryComputerNameW ; missing in XP SP3
|
@ stub SetLocalPrimaryComputerNameW ; missing in XP SP3
|
||||||
@ stdcall SetLocalTime(ptr)
|
@ stdcall SetLocalTime(ptr)
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
* FILE: lib/kernel32/misc/env.c
|
* FILE: lib/kernel32/misc/env.c
|
||||||
* PURPOSE: Environment functions
|
* PURPOSE: Environment functions
|
||||||
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
|
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
|
||||||
|
* Emanuele Aliberti
|
||||||
|
* Thomas Weidenmueller
|
||||||
* UPDATE HISTORY:
|
* UPDATE HISTORY:
|
||||||
* Created 01/11/98
|
* Created 01/11/98
|
||||||
*/
|
*/
|
||||||
|
@ -17,6 +19,85 @@
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
Beep (DWORD dwFreq, DWORD dwDuration)
|
||||||
|
{
|
||||||
|
HANDLE hBeep;
|
||||||
|
UNICODE_STRING BeepDevice;
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
|
BEEP_SET_PARAMETERS BeepSetParameters;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
/* check the parameters */
|
||||||
|
if ((dwFreq >= 0x25 && dwFreq <= 0x7FFF) ||
|
||||||
|
(dwFreq == 0x0 && dwDuration == 0x0))
|
||||||
|
{
|
||||||
|
/* open the device */
|
||||||
|
RtlInitUnicodeString(&BeepDevice,
|
||||||
|
L"\\Device\\Beep");
|
||||||
|
|
||||||
|
InitializeObjectAttributes(&ObjectAttributes,
|
||||||
|
&BeepDevice,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
Status = NtCreateFile(&hBeep,
|
||||||
|
FILE_READ_DATA | FILE_WRITE_DATA,
|
||||||
|
&ObjectAttributes,
|
||||||
|
&IoStatusBlock,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
FILE_OPEN_IF,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
/* Set beep data */
|
||||||
|
BeepSetParameters.Frequency = dwFreq;
|
||||||
|
BeepSetParameters.Duration = dwDuration;
|
||||||
|
|
||||||
|
Status = NtDeviceIoControlFile(hBeep,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&IoStatusBlock,
|
||||||
|
IOCTL_BEEP_SET,
|
||||||
|
&BeepSetParameters,
|
||||||
|
sizeof(BEEP_SET_PARAMETERS),
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
|
||||||
|
/* do an alertable wait if necessary */
|
||||||
|
if (NT_SUCCESS(Status) &&
|
||||||
|
(dwFreq != 0x0 || dwDuration != 0x0) && dwDuration != MAXDWORD)
|
||||||
|
{
|
||||||
|
SleepEx(dwDuration,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
NtClose(hBeep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastErrorByStatus (Status);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,99 +1,45 @@
|
||||||
/* $Id$
|
/*
|
||||||
*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
* FILE: dll/win32/kernel32/misc/error.c
|
* FILE: dll/win32/kernel32/misc/error.c
|
||||||
* PURPOSE: Environment functions
|
* PURPOSE: Error functions
|
||||||
* PROGRAMMER: Emanuele Aliberti
|
* PROGRAMMER: Pierre Schweitzer (pierre.schweitzer@reactos.org)
|
||||||
* Thomas Weidenmueller
|
|
||||||
* UPDATE HISTORY:
|
|
||||||
* Created 05/10/98
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <k32.h>
|
#include <k32.h>
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
|
||||||
/*
|
DWORD g_dwLastErrorToBreakOn;
|
||||||
* @implemented
|
|
||||||
*/
|
/* FUNCTIONS ******************************************************************/
|
||||||
BOOL
|
|
||||||
|
VOID
|
||||||
WINAPI
|
WINAPI
|
||||||
Beep (DWORD dwFreq, DWORD dwDuration)
|
SetLastError(
|
||||||
|
IN DWORD dwErrCode)
|
||||||
{
|
{
|
||||||
HANDLE hBeep;
|
if (g_dwLastErrorToBreakOn)
|
||||||
UNICODE_STRING BeepDevice;
|
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
||||||
IO_STATUS_BLOCK IoStatusBlock;
|
|
||||||
BEEP_SET_PARAMETERS BeepSetParameters;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
/* check the parameters */
|
|
||||||
if ((dwFreq >= 0x25 && dwFreq <= 0x7FFF) ||
|
|
||||||
(dwFreq == 0x0 && dwDuration == 0x0))
|
|
||||||
{
|
{
|
||||||
/* open the device */
|
/* If we have error to break on and if current matches, break */
|
||||||
RtlInitUnicodeString(&BeepDevice,
|
if (g_dwLastErrorToBreakOn == dwErrCode)
|
||||||
L"\\Device\\Beep");
|
|
||||||
|
|
||||||
InitializeObjectAttributes(&ObjectAttributes,
|
|
||||||
&BeepDevice,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
Status = NtCreateFile(&hBeep,
|
|
||||||
FILE_READ_DATA | FILE_WRITE_DATA,
|
|
||||||
&ObjectAttributes,
|
|
||||||
&IoStatusBlock,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
||||||
FILE_OPEN_IF,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
0);
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
{
|
||||||
/* Set beep data */
|
DbgBreakPoint();
|
||||||
BeepSetParameters.Frequency = dwFreq;
|
|
||||||
BeepSetParameters.Duration = dwDuration;
|
|
||||||
|
|
||||||
Status = NtDeviceIoControlFile(hBeep,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
&IoStatusBlock,
|
|
||||||
IOCTL_BEEP_SET,
|
|
||||||
&BeepSetParameters,
|
|
||||||
sizeof(BEEP_SET_PARAMETERS),
|
|
||||||
NULL,
|
|
||||||
0);
|
|
||||||
|
|
||||||
/* do an alertable wait if necessary */
|
|
||||||
if (NT_SUCCESS(Status) &&
|
|
||||||
(dwFreq != 0x0 || dwDuration != 0x0) && dwDuration != MAXDWORD)
|
|
||||||
{
|
|
||||||
SleepEx(dwDuration,
|
|
||||||
TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
NtClose(hBeep);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
/* Set last error */
|
||||||
{
|
NtCurrentTeb()->LastErrorValue = dwErrCode;
|
||||||
SetLastErrorByStatus (Status);
|
}
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
VOID
|
||||||
|
WINAPI
|
||||||
|
BaseSetLastNTError(
|
||||||
|
IN NTSTATUS Status)
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(Status));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -102,19 +102,18 @@ GetDllLoadPath(LPCWSTR lpModule)
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
WINAPI
|
WINAPI
|
||||||
DisableThreadLibraryCalls (
|
DisableThreadLibraryCalls(
|
||||||
HMODULE hLibModule
|
IN HMODULE hLibModule)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
Status = LdrDisableThreadCalloutsForDll ((PVOID)hLibModule);
|
Status = LdrDisableThreadCalloutsForDll((PVOID)hLibModule);
|
||||||
if (!NT_SUCCESS (Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
SetLastErrorByStatus (Status);
|
BaseSetLastNTError(Status);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -136,18 +135,17 @@ LoadLibraryA (
|
||||||
*/
|
*/
|
||||||
HINSTANCE
|
HINSTANCE
|
||||||
WINAPI
|
WINAPI
|
||||||
LoadLibraryExA (
|
LoadLibraryExA(
|
||||||
LPCSTR lpLibFileName,
|
LPCSTR lpLibFileName,
|
||||||
HANDLE hFile,
|
HANDLE hFile,
|
||||||
DWORD dwFlags
|
DWORD dwFlags)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
PWCHAR FileNameW;
|
PUNICODE_STRING FileNameW;
|
||||||
|
|
||||||
if (!(FileNameW = FilenameA2W(lpLibFileName, FALSE)))
|
if (!(FileNameW = Basep8BitStringToStaticUnicodeString(lpLibFileName)))
|
||||||
return FALSE;
|
return NULL;
|
||||||
|
|
||||||
return LoadLibraryExW(FileNameW, hFile, dwFlags);
|
return LoadLibraryExW(FileNameW->Buffer, hFile, dwFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,28 +57,27 @@ Basep8BitStringToLiveUnicodeString(OUT PUNICODE_STRING UnicodeString,
|
||||||
*/
|
*/
|
||||||
PUNICODE_STRING
|
PUNICODE_STRING
|
||||||
WINAPI
|
WINAPI
|
||||||
Basep8BitStringToCachedUnicodeString(IN LPCSTR String)
|
Basep8BitStringToStaticUnicodeString(IN LPCSTR String)
|
||||||
{
|
{
|
||||||
PUNICODE_STRING StaticString = &NtCurrentTeb()->StaticUnicodeString;
|
PUNICODE_STRING StaticString = &(NtCurrentTeb()->StaticUnicodeString);
|
||||||
ANSI_STRING AnsiString;
|
ANSI_STRING AnsiString;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("Basep8BitStringToCachedUnicodeString\n");
|
|
||||||
|
|
||||||
/* Initialize an ANSI String */
|
/* Initialize an ANSI String */
|
||||||
RtlInitAnsiString(&AnsiString, String);
|
if (!NT_SUCCESS(RtlInitAnsiStringEx(&AnsiString, String)))
|
||||||
|
|
||||||
/* Convert it */
|
|
||||||
Status = Basep8BitStringToUnicodeString(StaticString, &AnsiString, FALSE);
|
|
||||||
|
|
||||||
/* Handle failure */
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
{
|
||||||
SetLastErrorByStatus(Status);
|
SetLastError(ERROR_FILENAME_EXCED_RANGE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert it */
|
||||||
|
Status = Basep8BitStringToUnicodeString(StaticString, &AnsiString, FALSE);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
BaseSetLastNTError(Status);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return pointer to the string */
|
|
||||||
return StaticString;
|
return StaticString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1558,7 +1558,7 @@ CreateProcessInternalA(HANDLE hToken,
|
||||||
NtCurrentTeb()->StaticUnicodeString.MaximumLength)
|
NtCurrentTeb()->StaticUnicodeString.MaximumLength)
|
||||||
{
|
{
|
||||||
/* Cache it in the TEB */
|
/* Cache it in the TEB */
|
||||||
CommandLine = Basep8BitStringToCachedUnicodeString(lpCommandLine);
|
CommandLine = Basep8BitStringToStaticUnicodeString(lpCommandLine);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue