[KERNEL32]

- Whitespace fixes (dosdev.c, except.c, loader.c)
- except.c: Remove some unneeded casts; NtQueryInformationProcess for 'ProcessDebugPort' is implemented and therefore it will never return STATUS_NOT_IMPLEMENTED.

svn path=/trunk/; revision=71703
This commit is contained in:
Hermès Bélusca-Maïto 2016-06-30 14:00:34 +00:00
parent b92e83d7b9
commit 876a3b2681
3 changed files with 91 additions and 82 deletions

View file

@ -442,7 +442,7 @@ QueryDosDeviceW(
if (Length + NameLength + 1 >= ucchMax) if (Length + NameLength + 1 >= ucchMax)
{ {
Length = 0; Length = 0;
BaseSetLastNTError (STATUS_BUFFER_TOO_SMALL); BaseSetLastNTError(STATUS_BUFFER_TOO_SMALL);
break; break;
} }

View file

@ -85,7 +85,7 @@ PrintStackTrace(struct _EXCEPTION_POINTERS *ExceptionInfo)
DbgPrint("Unhandled exception\n"); DbgPrint("Unhandled exception\n");
DbgPrint("ExceptionCode: %8x\n", ExceptionRecord->ExceptionCode); DbgPrint("ExceptionCode: %8x\n", ExceptionRecord->ExceptionCode);
if ((NTSTATUS)ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION && if (ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION &&
ExceptionRecord->NumberParameters == 2) ExceptionRecord->NumberParameters == 2)
{ {
DbgPrint("Faulting Address: %8x\n", ExceptionRecord->ExceptionInformation[1]); DbgPrint("Faulting Address: %8x\n", ExceptionRecord->ExceptionInformation[1]);
@ -209,7 +209,7 @@ GetErrorMode(VOID)
/* Query the current setting */ /* Query the current setting */
Status = NtQueryInformationProcess(NtCurrentProcess(), Status = NtQueryInformationProcess(NtCurrentProcess(),
ProcessDefaultHardErrorMode, ProcessDefaultHardErrorMode,
(PVOID)&ErrMode, &ErrMode,
sizeof(ErrMode), sizeof(ErrMode),
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -238,97 +238,106 @@ GetErrorMode(VOID)
/* /*
* @implemented * @implemented
*/ */
LONG WINAPI LONG
UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo) WINAPI
UnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo)
{ {
LONG RetValue; NTSTATUS Status;
HANDLE DebugPort = NULL; LONG RetValue;
NTSTATUS ErrCode; HANDLE DebugPort = NULL;
ULONG_PTR ErrorParameters[4]; ULONG_PTR ErrorParameters[4];
ULONG ErrorResponse; ULONG ErrorResponse;
PEXCEPTION_RECORD ExceptionRecord = ExceptionInfo->ExceptionRecord; PEXCEPTION_RECORD ExceptionRecord = ExceptionInfo->ExceptionRecord;
LPTOP_LEVEL_EXCEPTION_FILTER RealFilter; LPTOP_LEVEL_EXCEPTION_FILTER RealFilter;
if ((NTSTATUS)ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION && if (ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION &&
ExceptionRecord->NumberParameters >= 2) ExceptionRecord->NumberParameters >= 2)
{ {
switch(ExceptionRecord->ExceptionInformation[0]) switch(ExceptionRecord->ExceptionInformation[0])
{ {
case EXCEPTION_WRITE_FAULT: case EXCEPTION_WRITE_FAULT:
/* Change the protection on some write attempts, some InstallShield setups /* Change the protection on some write attempts, some InstallShield setups
have this bug */ have this bug */
RetValue = BasepCheckForReadOnlyResource( RetValue = BasepCheckForReadOnlyResource(
(PVOID)ExceptionRecord->ExceptionInformation[1]); (PVOID)ExceptionRecord->ExceptionInformation[1]);
if (RetValue == EXCEPTION_CONTINUE_EXECUTION) if (RetValue == EXCEPTION_CONTINUE_EXECUTION)
return EXCEPTION_CONTINUE_EXECUTION; return EXCEPTION_CONTINUE_EXECUTION;
break; break;
case EXCEPTION_EXECUTE_FAULT:
/* FIXME */
break;
}
}
/* Is there a debugger running ? */ case EXCEPTION_EXECUTE_FAULT:
ErrCode = NtQueryInformationProcess(NtCurrentProcess(), ProcessDebugPort, /* FIXME */
&DebugPort, sizeof(HANDLE), NULL); break;
if (!NT_SUCCESS(ErrCode) && ErrCode != STATUS_NOT_IMPLEMENTED) }
{ }
BaseSetLastNTError(ErrCode);
return EXCEPTION_EXECUTE_HANDLER;
}
if (DebugPort) /* Is there a debugger running? */
{ Status = NtQueryInformationProcess(NtCurrentProcess(),
/* Pass the exception to debugger. */ ProcessDebugPort,
DPRINT("Passing exception to debugger\n"); &DebugPort,
return EXCEPTION_CONTINUE_SEARCH; sizeof(DebugPort),
} NULL);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError(Status);
return EXCEPTION_EXECUTE_HANDLER;
}
RealFilter = RtlDecodePointer(GlobalTopLevelExceptionFilter); if (DebugPort)
if (RealFilter) {
{ /* Pass the exception to debugger. */
LONG ret = RealFilter(ExceptionInfo); DPRINT("Passing exception to debugger\n");
if (ret != EXCEPTION_CONTINUE_SEARCH) return EXCEPTION_CONTINUE_SEARCH;
return ret; }
}
PrintStackTrace(ExceptionInfo); RealFilter = RtlDecodePointer(GlobalTopLevelExceptionFilter);
if (RealFilter)
{
LONG ret = RealFilter(ExceptionInfo);
if (ret != EXCEPTION_CONTINUE_SEARCH)
return ret;
}
/* Save exception code and address */ PrintStackTrace(ExceptionInfo);
ErrorParameters[0] = (ULONG)ExceptionRecord->ExceptionCode;
ErrorParameters[1] = (ULONG_PTR)ExceptionRecord->ExceptionAddress;
if ((NTSTATUS)ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION) /* Save exception code and address */
{ ErrorParameters[0] = (ULONG)ExceptionRecord->ExceptionCode;
/* get the type of operation that caused the access violation */ ErrorParameters[1] = (ULONG_PTR)ExceptionRecord->ExceptionAddress;
ErrorParameters[2] = ExceptionRecord->ExceptionInformation[0];
}
else
{
ErrorParameters[2] = ExceptionRecord->ExceptionInformation[2];
}
/* Save faulting address */ if (ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION)
ErrorParameters[3] = ExceptionRecord->ExceptionInformation[1]; {
/* get the type of operation that caused the access violation */
ErrorParameters[2] = ExceptionRecord->ExceptionInformation[0];
}
else
{
ErrorParameters[2] = ExceptionRecord->ExceptionInformation[2];
}
/* Raise the harderror */ /* Save faulting address */
ErrCode = NtRaiseHardError(STATUS_UNHANDLED_EXCEPTION, ErrorParameters[3] = ExceptionRecord->ExceptionInformation[1];
4, 0, ErrorParameters, OptionOkCancel, &ErrorResponse);
if (NT_SUCCESS(ErrCode) && (ErrorResponse == ResponseCancel)) /* Raise the harderror */
{ Status = NtRaiseHardError(STATUS_UNHANDLED_EXCEPTION,
/* FIXME: Check the result, if the "Cancel" button was 4,
clicked run a debugger */ 0,
DPRINT1("Debugging is not implemented yet\n"); ErrorParameters,
} OptionOkCancel,
&ErrorResponse);
/* if (NT_SUCCESS(Status) && (ErrorResponse == ResponseCancel))
* Returning EXCEPTION_EXECUTE_HANDLER means that the code in {
* the __except block will be executed. Normally this will end up in a /* FIXME: Check the result, if the "Cancel" button was
* Terminate process. clicked run a debugger */
*/ DPRINT1("Debugging is not implemented yet\n");
}
return EXCEPTION_EXECUTE_HANDLER; /*
* Returning EXCEPTION_EXECUTE_HANDLER means that the code in
* the __except block will be executed. Normally this will end up in a
* Terminate process.
*/
return EXCEPTION_EXECUTE_HANDLER;
} }
/* /*

View file

@ -177,7 +177,7 @@ DECLSPEC_HOTPATCH
LoadLibraryW(LPCWSTR lpLibFileName) LoadLibraryW(LPCWSTR lpLibFileName)
{ {
/* Call Ex version of the API */ /* Call Ex version of the API */
return LoadLibraryExW (lpLibFileName, 0, 0); return LoadLibraryExW(lpLibFileName, 0, 0);
} }