2006-11-08 11:47:44 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS Run-Time Library
|
|
|
|
* FILE: ntoskrnl/rtl/dbgprint.c
|
|
|
|
* PURPOSE: Debug Print and Prompt routines
|
|
|
|
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
|
|
|
|
* Royce Mitchel III
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
|
|
|
|
#include <rtl.h>
|
|
|
|
|
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
|
|
|
/* PRIVATE FUNCTIONS ********************************************************/
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
DebugPrint(IN PANSI_STRING DebugString,
|
|
|
|
IN ULONG ComponentId,
|
|
|
|
IN ULONG Level)
|
|
|
|
{
|
|
|
|
/* Call the INT2D Service */
|
|
|
|
return DebugService(BREAKPOINT_PRINT,
|
|
|
|
DebugString->Buffer,
|
|
|
|
DebugString->Length,
|
|
|
|
UlongToPtr(ComponentId),
|
2007-03-02 06:11:27 +00:00
|
|
|
UlongToPtr(Level));
|
2006-11-08 11:47:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
2006-11-19 21:14:49 +00:00
|
|
|
DebugPrompt(IN PCSTRING Output,
|
|
|
|
IN PSTRING Input)
|
2006-11-08 11:47:44 +00:00
|
|
|
{
|
|
|
|
/* Call the INT2D Service */
|
|
|
|
return DebugService(BREAKPOINT_PROMPT,
|
|
|
|
Output->Buffer,
|
|
|
|
Output->Length,
|
|
|
|
Input->Buffer,
|
|
|
|
UlongToPtr(Input->MaximumLength));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FUNCTIONS ****************************************************************/
|
|
|
|
|
|
|
|
ULONG
|
|
|
|
NTAPI
|
|
|
|
vDbgPrintExWithPrefixInternal(IN LPCSTR Prefix,
|
|
|
|
IN ULONG ComponentId,
|
|
|
|
IN ULONG Level,
|
|
|
|
IN LPCSTR Format,
|
|
|
|
IN va_list ap,
|
|
|
|
IN BOOLEAN HandleBreakpoint)
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
|
|
|
ANSI_STRING DebugString;
|
|
|
|
CHAR Buffer[512];
|
|
|
|
PCHAR pBuffer = Buffer;
|
|
|
|
ULONG pBufferSize = sizeof(Buffer);
|
|
|
|
ULONG Length;
|
|
|
|
EXCEPTION_RECORD ExceptionRecord;
|
|
|
|
|
|
|
|
/* Check if we should print it or not */
|
|
|
|
if (ComponentId != -1 && !NtQueryDebugFilterState(ComponentId, Level))
|
|
|
|
{
|
|
|
|
/* This message is masked */
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* For user mode, don't recursively DbgPrint */
|
|
|
|
if (RtlpSetInDbgPrint(TRUE)) return STATUS_SUCCESS;
|
|
|
|
|
|
|
|
/* Initialize the length to 8 */
|
|
|
|
DebugString.Length = 0;
|
|
|
|
|
|
|
|
/* Handle the prefix */
|
|
|
|
if (Prefix && *Prefix)
|
|
|
|
{
|
|
|
|
/* Get the length */
|
|
|
|
DebugString.Length = strlen(Prefix);
|
|
|
|
|
|
|
|
/* Normalize it */
|
|
|
|
if(DebugString.Length > sizeof(Buffer))
|
|
|
|
{
|
|
|
|
DebugString.Length = sizeof(Buffer);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Copy it */
|
|
|
|
strncpy(Buffer, Prefix, DebugString.Length);
|
|
|
|
|
|
|
|
/* Set the pointer and update the size */
|
|
|
|
pBuffer = &Buffer[DebugString.Length];
|
|
|
|
pBufferSize -= DebugString.Length;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Setup the ANSI String */
|
|
|
|
DebugString.Buffer = Buffer;
|
|
|
|
DebugString.MaximumLength = sizeof(Buffer);
|
|
|
|
Length = _vsnprintf(pBuffer, pBufferSize, Format, ap);
|
|
|
|
|
|
|
|
/* Check if we went past the buffer */
|
|
|
|
if (Length == -1)
|
|
|
|
{
|
|
|
|
/* Terminate it if we went over-board */
|
|
|
|
Buffer[sizeof(Buffer) - 1] = '\n';
|
|
|
|
|
|
|
|
/* Put maximum */
|
|
|
|
Length = sizeof(Buffer);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Update length */
|
2007-03-02 07:21:33 +00:00
|
|
|
DebugString.Length += (USHORT)Length;
|
2006-11-08 11:47:44 +00:00
|
|
|
|
|
|
|
/* First, let the debugger know as well */
|
|
|
|
if (RtlpCheckForActiveDebugger(FALSE))
|
|
|
|
{
|
|
|
|
/* Fill out an exception record */
|
|
|
|
ExceptionRecord.ExceptionCode = DBG_PRINTEXCEPTION_C;
|
|
|
|
ExceptionRecord.ExceptionRecord = NULL;
|
|
|
|
ExceptionRecord.NumberParameters = 2;
|
|
|
|
ExceptionRecord.ExceptionFlags = 0;
|
|
|
|
ExceptionRecord.ExceptionInformation[0] = DebugString.Length + 1;
|
|
|
|
ExceptionRecord.ExceptionInformation[1] = (ULONG_PTR)DebugString.Buffer;
|
|
|
|
|
|
|
|
/* Raise the exception */
|
|
|
|
RtlRaiseException(&ExceptionRecord);
|
|
|
|
|
|
|
|
/* This code only runs in user-mode, so setting the flag is safe */
|
|
|
|
NtCurrentTeb()->InDbgPrint = FALSE;
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Call the Debug Print routine */
|
|
|
|
Status = DebugPrint(&DebugString, ComponentId, Level);
|
|
|
|
|
|
|
|
/* Check if this was with Control-C */
|
|
|
|
if (HandleBreakpoint)
|
|
|
|
{
|
|
|
|
/* Check if we got a breakpoint */
|
|
|
|
if (Status == STATUS_BREAKPOINT)
|
|
|
|
{
|
|
|
|
/* Breakpoint */
|
2007-03-04 19:06:34 +00:00
|
|
|
//DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
|
2006-11-08 11:47:44 +00:00
|
|
|
Status = STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* In user-mode, remove the InDbgPrint Flag */
|
|
|
|
RtlpSetInDbgPrint(FALSE);
|
|
|
|
|
|
|
|
/* Return */
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
ULONG
|
|
|
|
NTAPI
|
|
|
|
vDbgPrintExWithPrefix(IN LPCSTR Prefix,
|
|
|
|
IN ULONG ComponentId,
|
|
|
|
IN ULONG Level,
|
|
|
|
IN LPCSTR Format,
|
|
|
|
IN va_list ap)
|
|
|
|
{
|
|
|
|
/* Call the internal routine that also handles ControlC */
|
|
|
|
return vDbgPrintExWithPrefixInternal(Prefix,
|
|
|
|
ComponentId,
|
|
|
|
Level,
|
|
|
|
Format,
|
|
|
|
ap,
|
|
|
|
TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
ULONG
|
|
|
|
NTAPI
|
|
|
|
vDbgPrintEx(IN ULONG ComponentId,
|
|
|
|
IN ULONG Level,
|
|
|
|
IN LPCSTR Format,
|
|
|
|
IN va_list ap)
|
|
|
|
{
|
|
|
|
/* Call the internal routine that also handles ControlC */
|
|
|
|
return vDbgPrintExWithPrefixInternal(NULL,
|
|
|
|
ComponentId,
|
|
|
|
Level,
|
|
|
|
Format,
|
|
|
|
ap,
|
|
|
|
TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
ULONG
|
|
|
|
__cdecl
|
|
|
|
DbgPrint(PCCH Format,
|
|
|
|
...)
|
|
|
|
{
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
/* Call the internal routine that also handles ControlC */
|
|
|
|
va_start(ap, Format);
|
|
|
|
return vDbgPrintExWithPrefixInternal(NULL,
|
|
|
|
-1,
|
|
|
|
DPFLTR_ERROR_LEVEL,
|
|
|
|
Format,
|
|
|
|
ap,
|
|
|
|
TRUE);
|
|
|
|
va_end(ap);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
ULONG
|
|
|
|
__cdecl
|
|
|
|
DbgPrintEx(IN ULONG ComponentId,
|
|
|
|
IN ULONG Level,
|
|
|
|
IN PCCH Format,
|
|
|
|
...)
|
|
|
|
{
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
/* Call the internal routine that also handles ControlC */
|
|
|
|
va_start(ap, Format);
|
|
|
|
return vDbgPrintExWithPrefixInternal(NULL,
|
|
|
|
ComponentId,
|
|
|
|
Level,
|
|
|
|
Format,
|
|
|
|
ap,
|
|
|
|
TRUE);
|
|
|
|
va_end(ap);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
ULONG
|
|
|
|
__cdecl
|
|
|
|
DbgPrintReturnControlC(PCH Format,
|
|
|
|
...)
|
|
|
|
{
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
/* Call the internal routine that also handles ControlC */
|
|
|
|
va_start(ap, Format);
|
|
|
|
return vDbgPrintExWithPrefixInternal(NULL,
|
|
|
|
-1,
|
|
|
|
DPFLTR_ERROR_LEVEL,
|
|
|
|
Format,
|
|
|
|
ap,
|
|
|
|
FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
ULONG
|
|
|
|
NTAPI
|
2006-11-19 21:14:49 +00:00
|
|
|
DbgPrompt(IN PCCH Prompt,
|
|
|
|
OUT PCH Response,
|
|
|
|
IN ULONG MaximumResponseLength)
|
2006-11-08 11:47:44 +00:00
|
|
|
{
|
2006-11-19 21:14:49 +00:00
|
|
|
CSTRING Output;
|
|
|
|
STRING Input;
|
2006-11-08 11:47:44 +00:00
|
|
|
|
|
|
|
/* Setup the input string */
|
2007-03-02 07:21:33 +00:00
|
|
|
Input.MaximumLength = (USHORT)MaximumResponseLength;
|
2006-11-19 21:14:49 +00:00
|
|
|
Input.Buffer = Response;
|
2006-11-08 11:47:44 +00:00
|
|
|
|
|
|
|
/* Setup the output string */
|
2007-03-02 07:21:33 +00:00
|
|
|
Output.Length = strlen(Prompt);
|
2006-11-19 21:14:49 +00:00
|
|
|
Output.Buffer = Prompt;
|
2006-11-08 11:47:44 +00:00
|
|
|
|
|
|
|
/* Call the system service */
|
|
|
|
return DebugPrompt(&Output, &Input);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2007-03-02 07:21:33 +00:00
|
|
|
NTSTATUS
|
2006-11-08 11:47:44 +00:00
|
|
|
NTAPI
|
|
|
|
DbgQueryDebugFilterState(IN ULONG ComponentId,
|
|
|
|
IN ULONG Level)
|
|
|
|
{
|
|
|
|
/* Call the Nt routine */
|
|
|
|
return NtQueryDebugFilterState(ComponentId, Level);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
DbgSetDebugFilterState(IN ULONG ComponentId,
|
|
|
|
IN ULONG Level,
|
|
|
|
IN BOOLEAN State)
|
|
|
|
{
|
|
|
|
/* Call the Nt routine */
|
|
|
|
return NtSetDebugFilterState(ComponentId, Level, State);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2007-01-24 19:48:34 +00:00
|
|
|
* @implemented
|
2006-11-08 11:47:44 +00:00
|
|
|
*/
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
2007-01-24 19:48:34 +00:00
|
|
|
DbgLoadImageSymbols(IN PANSI_STRING Name,
|
|
|
|
IN PVOID Base,
|
2007-07-28 21:30:16 +00:00
|
|
|
IN ULONG_PTR ProcessId)
|
2006-11-08 11:47:44 +00:00
|
|
|
{
|
2007-01-24 19:48:34 +00:00
|
|
|
PIMAGE_NT_HEADERS NtHeader;
|
|
|
|
KD_SYMBOLS_INFO SymbolInfo;
|
|
|
|
|
|
|
|
/* Setup the symbol data */
|
|
|
|
SymbolInfo.BaseOfDll = Base;
|
- Fix KiDispatchException to unmask KI_EXCEPTION_INTERNAL when setting the exception code, so that usermode/SEH filters get proper exception codes again.
- Fixes and compatible merges from KD Branch:
- Add stubs for KdSave, KdRestore, KdDebuggerInitialize0, KdSendPacket, KdReceivePacket to kdcom.dll
- Implement and export KeTryToAcquireSpinLockAtDpcLevel.
- Add EXCEPTION_RECORD64 and LIST_ENTRY64, KeTryToAcquireSpinLockAtDpcLevel, BREAKPOINT_COMMAND_STRING, Ke386SetCr2, Ke386SetDr3, Ke386SetDr6.
- Remove non-kernel routines from kdfuncs.h and remove deprecated routines from ke.h.
- Implement KiRestoreProcessorControlState, KeFreezeExecution, KeThawExecution, ExAcquireTimeRefreshLock, ExReleaseTimeRefreshLock.
- Rename ModuleLoadList to PsLoadedModuleList. Add PsNtosImageBase and set value in it.
- Add skeleton wdbgexts.h with what's needed until now, this is a PSDK header.
- Add kddll.h for KDCOM/1394/USB2.DLL prototypes.
- Add windbgkd.h with KD protocol definitions. Used to be an NT5 DDK header, but was removed, so this goes into include\reactos.
- Fix KiDebugService to load EDX from KTRAP_FRAME_EDX, not KTRAP_FRAME_EAX!.
- Fix CommonDispatchException to check for the argument count in ECX, not EAX. Previously we were ignoring parameter counts and never filling out exception records!
- Add KdDebuggerInitialize1 and enable call to it.
- Fix KD_SYMBOLS_INFO definition and DbgLoadImageSymbols prototype.
- Implement DbgUnLoadImageSymbols.
- Fix some small bugs in KeBugCheckWithTf and add various debugger calls/checks where needed.
- Fix bugcheck recursion code which was incorrect.
- Only save/restore CR4 if KeFeatureBits indicates CR4 support exists.
- Export KdDebuggerNotPresent since KDCOM needs it.
- Add KCONTINUE_STATUS.
- Add DBGKD_ANY_CONTROL_SET and X86/IA64/AMD64 control sets.
- Add DBGKD_MANIPULATE_STATE64 and all sub-structures (READ_MEMORY, WRITE_MEMORY, etc).
- Create GCC_ULONG64 type to hack around a bug in GCC which is incapable of creating entries for externals at compile-time for 64-bit pointers.
- Rename NameSpaceRoot to ObpRootDirectoryObject, IopLogListHead to IopErrorLogListHead, BugcheckCallbackListHead to KeBugcheckCallbackListHead, BugcheckReasonCallbackListHead to KeBugcheckReasonCallbackListHead, ObTypeObjectType to ObpTypeObjectType.
- Create ntverp.h and common.ver files. These are the standard files used by the NT/DDK build systems and we should try to support them as well instead of re-defining everything our own way (especially if we want to build ddk-compatible drivers later on).
- Made init.c use version data from ntverp.h instead of hard-coding.
- Defined NT 5.2.3790.1830 as the version we report.
- Fixed up .rc file to be correct and match DDK-sytnax/style.
- For now only the kernel uses this new versionning scheme, but we should change the build system later to use this for every component.
- Fix KiSaveProcessorControlState and KiRestoreProcessorControlSate. The latter doesn't freeze the CPU anymore so it's enabled, and the former doesn't cause WinDBG to panic anymore and display weird data.
- KPROCESSOR_STATE is not 4-byte aligned.
- Use DR_MASK and DR7_OVERRIDE_V in KiUpdateDr7, KiRecordDr7 instead of DR_ACTIVE_MASK.
- Add ExceptionRecord32To64.
- Fix generation of driver name for symbol load.
svn path=/trunk/; revision=25937
2007-03-01 19:51:20 +00:00
|
|
|
SymbolInfo.ProcessId = (ULONG)ProcessId;
|
2007-01-24 19:48:34 +00:00
|
|
|
|
|
|
|
/* Get NT Headers */
|
2007-03-03 05:44:58 +00:00
|
|
|
NtHeader = RtlImageNtHeader(Base);
|
2007-01-24 19:48:34 +00:00
|
|
|
if (NtHeader)
|
|
|
|
{
|
|
|
|
/* Get the rest of the data */
|
|
|
|
SymbolInfo.CheckSum = NtHeader->OptionalHeader.CheckSum;
|
|
|
|
SymbolInfo.SizeOfImage = NtHeader->OptionalHeader.SizeOfImage;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* No data available */
|
|
|
|
SymbolInfo.CheckSum = SymbolInfo.SizeOfImage = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Load the symbols */
|
|
|
|
DebugService2(Name, &SymbolInfo, BREAKPOINT_LOAD_SYMBOLS);
|
|
|
|
return STATUS_SUCCESS;
|
2006-11-08 11:47:44 +00:00
|
|
|
}
|
2007-02-23 07:13:19 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
DbgUnLoadImageSymbols(IN PANSI_STRING Name,
|
|
|
|
IN PVOID Base,
|
|
|
|
IN ULONG_PTR ProcessId)
|
|
|
|
{
|
|
|
|
KD_SYMBOLS_INFO SymbolInfo;
|
|
|
|
|
|
|
|
/* Setup the symbol data */
|
|
|
|
SymbolInfo.BaseOfDll = Base;
|
- Fix KiDispatchException to unmask KI_EXCEPTION_INTERNAL when setting the exception code, so that usermode/SEH filters get proper exception codes again.
- Fixes and compatible merges from KD Branch:
- Add stubs for KdSave, KdRestore, KdDebuggerInitialize0, KdSendPacket, KdReceivePacket to kdcom.dll
- Implement and export KeTryToAcquireSpinLockAtDpcLevel.
- Add EXCEPTION_RECORD64 and LIST_ENTRY64, KeTryToAcquireSpinLockAtDpcLevel, BREAKPOINT_COMMAND_STRING, Ke386SetCr2, Ke386SetDr3, Ke386SetDr6.
- Remove non-kernel routines from kdfuncs.h and remove deprecated routines from ke.h.
- Implement KiRestoreProcessorControlState, KeFreezeExecution, KeThawExecution, ExAcquireTimeRefreshLock, ExReleaseTimeRefreshLock.
- Rename ModuleLoadList to PsLoadedModuleList. Add PsNtosImageBase and set value in it.
- Add skeleton wdbgexts.h with what's needed until now, this is a PSDK header.
- Add kddll.h for KDCOM/1394/USB2.DLL prototypes.
- Add windbgkd.h with KD protocol definitions. Used to be an NT5 DDK header, but was removed, so this goes into include\reactos.
- Fix KiDebugService to load EDX from KTRAP_FRAME_EDX, not KTRAP_FRAME_EAX!.
- Fix CommonDispatchException to check for the argument count in ECX, not EAX. Previously we were ignoring parameter counts and never filling out exception records!
- Add KdDebuggerInitialize1 and enable call to it.
- Fix KD_SYMBOLS_INFO definition and DbgLoadImageSymbols prototype.
- Implement DbgUnLoadImageSymbols.
- Fix some small bugs in KeBugCheckWithTf and add various debugger calls/checks where needed.
- Fix bugcheck recursion code which was incorrect.
- Only save/restore CR4 if KeFeatureBits indicates CR4 support exists.
- Export KdDebuggerNotPresent since KDCOM needs it.
- Add KCONTINUE_STATUS.
- Add DBGKD_ANY_CONTROL_SET and X86/IA64/AMD64 control sets.
- Add DBGKD_MANIPULATE_STATE64 and all sub-structures (READ_MEMORY, WRITE_MEMORY, etc).
- Create GCC_ULONG64 type to hack around a bug in GCC which is incapable of creating entries for externals at compile-time for 64-bit pointers.
- Rename NameSpaceRoot to ObpRootDirectoryObject, IopLogListHead to IopErrorLogListHead, BugcheckCallbackListHead to KeBugcheckCallbackListHead, BugcheckReasonCallbackListHead to KeBugcheckReasonCallbackListHead, ObTypeObjectType to ObpTypeObjectType.
- Create ntverp.h and common.ver files. These are the standard files used by the NT/DDK build systems and we should try to support them as well instead of re-defining everything our own way (especially if we want to build ddk-compatible drivers later on).
- Made init.c use version data from ntverp.h instead of hard-coding.
- Defined NT 5.2.3790.1830 as the version we report.
- Fixed up .rc file to be correct and match DDK-sytnax/style.
- For now only the kernel uses this new versionning scheme, but we should change the build system later to use this for every component.
- Fix KiSaveProcessorControlState and KiRestoreProcessorControlSate. The latter doesn't freeze the CPU anymore so it's enabled, and the former doesn't cause WinDBG to panic anymore and display weird data.
- KPROCESSOR_STATE is not 4-byte aligned.
- Use DR_MASK and DR7_OVERRIDE_V in KiUpdateDr7, KiRecordDr7 instead of DR_ACTIVE_MASK.
- Add ExceptionRecord32To64.
- Fix generation of driver name for symbol load.
svn path=/trunk/; revision=25937
2007-03-01 19:51:20 +00:00
|
|
|
SymbolInfo.ProcessId = (ULONG)ProcessId;
|
2007-02-23 07:13:19 +00:00
|
|
|
SymbolInfo.CheckSum = SymbolInfo.SizeOfImage = 0;
|
|
|
|
|
|
|
|
/* Load the symbols */
|
|
|
|
DebugService2(Name, &SymbolInfo, BREAKPOINT_UNLOAD_SYMBOLS);
|
|
|
|
}
|
|
|
|
|
2006-11-08 11:47:44 +00:00
|
|
|
/* EOF */
|