Fixed loading of symbol files.

Implemented automatic loading of PICE.

svn path=/trunk/; revision=3102
This commit is contained in:
Eric Kohl 2002-06-16 11:45:06 +00:00
parent 56deabe577
commit d783d4d686
7 changed files with 124 additions and 449 deletions

View file

@ -1,4 +1,4 @@
/* $Id: registry.c,v 1.71 2002/05/05 14:57:43 chorns Exp $
/* $Id: registry.c,v 1.72 2002/06/16 11:45:06 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -463,6 +463,48 @@ CmInitializeRegistry(VOID)
}
VOID
CmInit2(PCHAR CommandLine)
{
PCHAR p1, p2;
ULONG PiceStart;
/* FIXME: Store current command line */
/* FIXME: Create the 'CurrentControlSet' link. */
/* Set PICE 'Start' value to 1, if PICE debugging is enabled */
PiceStart = 4;
p1 = (PCHAR)CommandLine;
while (p1 && (p2 = strchr(p1, '/')))
{
p2++;
if (_strnicmp(p2, "DEBUGPORT", 9) == 0)
{
p2 += 9;
if (*p2 == '=')
{
p2++;
if (_strnicmp(p2, "PICE", 4) == 0)
{
p2 += 4;
PiceStart = 1;
}
}
}
p1 = p2;
}
RtlWriteRegistryValue(RTL_REGISTRY_SERVICES,
L"\\Pice",
L"Start",
REG_DWORD,
&PiceStart,
sizeof(ULONG));
}
NTSTATUS
CmiConnectHive(PWSTR FileName,
PWSTR FullName,

View file

@ -19,6 +19,9 @@
#define FILESYSTEM_ROOT_NAME L"\\FileSystem\\"
extern ULONG_PTR LdrHalBase;
NTSTATUS
LdrLoadInitialProcess (
VOID
@ -92,7 +95,6 @@ VOID
LdrInit1(VOID);
VOID
LdrInitDebug(PLOADER_MODULE Module, PWCH Name);
VOID LdrLoadUserModuleSymbols(PLDR_MODULE ModuleObject);
PVOID LdrSafePEProcessModule(
PVOID ModuleLoadBase,
@ -110,6 +112,13 @@ LdrUnloadModule(PMODULE_OBJECT ModuleObject);
PMODULE_OBJECT
LdrGetModuleObject(PUNICODE_STRING ModuleName);
extern ULONG_PTR LdrHalBase;
#ifdef KDBG
VOID
LdrpLoadModuleSymbols(PMODULE_OBJECT ModuleObject);
VOID
LdrLoadUserModuleSymbols(PLDR_MODULE ModuleObject);
#endif /* KDBG */
#endif /* __INCLUDE_INTERNAL_LDR_H */

View file

@ -43,6 +43,7 @@ VOID IoInit(VOID);
VOID ObInit(VOID);
VOID PsInit(VOID);
VOID CmInitializeRegistry(VOID);
VOID CmInit2(PCHAR CommandLine);
VOID CmShutdownRegistry(VOID);
VOID CmImportHive(PCHAR ChunkBase, ULONG ChunkSize);
VOID KdInitSystem(ULONG Reserved, PLOADER_PARAMETER_BLOCK LoaderBlock);

View file

@ -1,4 +1,4 @@
/* $Id: driver.c,v 1.5 2002/06/13 15:13:54 ekohl Exp $
/* $Id: driver.c,v 1.6 2002/06/16 11:44:13 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -524,8 +524,34 @@ LdrLoadAutoConfigDrivers(VOID)
CHAR TextBuffer [256];
ULONG x, y, cx, cy;
#ifdef KDBG
UNICODE_STRING ModuleName;
PMODULE_OBJECT ModuleObject;
#endif
DPRINT("LdrLoadAutoConfigDrivers() called\n");
#ifdef KDBG
/*
* Load symbols for ntoskrnl.exe and hal.dll because \SystemRoot
* is created after their module entries
*/
RtlInitUnicodeString(&ModuleName, KERNEL_MODULE_NAME);
ModuleObject = LdrGetModuleObject(&ModuleName);
if (ModuleObject != NULL)
{
LdrpLoadModuleSymbols(ModuleObject);
}
RtlInitUnicodeString(&ModuleName, HAL_MODULE_NAME);
ModuleObject = LdrGetModuleObject(&ModuleName);
if (ModuleObject != NULL)
{
LdrpLoadModuleSymbols(ModuleObject);
}
#endif /* KDBG */
GroupEntry = GroupListHead.Flink;
while (GroupEntry != &GroupListHead)
{

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: main.c,v 1.124 2002/06/12 23:30:08 ekohl Exp $
/* $Id: main.c,v 1.125 2002/06/16 11:44:53 ekohl Exp $
*
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/main.c
@ -75,305 +75,9 @@ volatile BOOLEAN Initialized = FALSE;
extern PVOID Ki386InitialStackArray[MAXIMUM_PROCESSORS];
typedef struct
{
LPWSTR ServiceName;
LPWSTR DeviceDesc;
LPWSTR Group;
DWORD Start;
DWORD Type;
} SERVICE, *PSERVICE;
SERVICE Services[] = {
{L"pci", L"PCI Bus Driver", L"Boot Bus Extender", 0, 1},
{L"keyboard", L"Standard Keyboard Driver", L"Base", 0, 1},
{L"blue", L"Bluescreen Driver", L"Base", 0, 1},
{L"vidport", L"Video Port Driver", L"Base", 0, 1},
{L"vgamp", L"VGA Miniport", L"Base", 0, 1},
{L"minixfs", L"Minix File System", L"File system", 0, 1},
{L"msfs", L"Mail Slot File System", L"File system", 0, 1},
{L"npfs", L"Named Pipe File System", L"File system", 0, 1},
{L"psaux", L"PS/2 Auxillary Port Driver", L"", 0, 1},
{L"mouclass", L"Mouse Class Driver", L"Pointer Class", 0, 1},
{L"ndis", L"NDIS System Driver", L"NDIS Wrapper", 0, 1},
{L"ne2000", L"Novell Eagle 2000 Driver", L"NDIS", 0, 1},
{L"afd", L"AFD Networking Support Environment", L"TDI", 0, 1},
{NULL,}
};
/* FUNCTIONS ****************************************************************/
#define FULLREG
VOID CreateDefaultRegistryForLegacyDriver(
PSERVICE Service)
{
#ifdef FULLREG
WCHAR LegacyDriver[] = L"LegacyDriver";
#endif
WCHAR InstancePath[MAX_PATH];
WCHAR KeyNameBuffer[MAX_PATH];
WCHAR Name[MAX_PATH];
UNICODE_STRING KeyName;
HANDLE KeyHandle;
#ifdef FULLREG
DWORD DwordData;
#endif
ULONG Length;
NTSTATUS Status;
WCHAR ImagePath[MAX_PATH];
/* Enum section */
wcscpy(Name, Service->ServiceName);
_wcsupr(Name);
wcscpy(InstancePath, L"Root\\LEGACY_");
wcscat(InstancePath, Name);
wcscat(InstancePath, L"\\0000");
wcscpy(KeyNameBuffer, L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\");
wcscat(KeyNameBuffer, InstancePath);
RtlInitUnicodeString(&KeyName, KeyNameBuffer);
DPRINT("Key name is %S\n", KeyName.Buffer);
Status = RtlpCreateRegistryKeyPath(KeyName.Buffer);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlpCreateRegistryKeyPath() failed with status %x\n", Status);
return;
}
Status = RtlpGetRegistryHandle(
RTL_REGISTRY_ENUM,
InstancePath,
TRUE,
&KeyHandle);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlpGetRegistryHandle() failed (Status %x)\n", Status);
return;
}
#ifdef FULLREG
DwordData = 0;
Length = sizeof(DWORD);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"Capabilities",
REG_DWORD,
(LPWSTR)&DwordData,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
Length = (wcslen(LegacyDriver) + 1) * sizeof(WCHAR);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"Class",
REG_SZ,
LegacyDriver,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
#endif
Length = (wcslen(Service->DeviceDesc) + 1) * sizeof(WCHAR);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"DeviceDesc",
REG_SZ,
Service->DeviceDesc,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
#ifdef FULLREG
DwordData = 0;
Length = sizeof(DWORD);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"Legacy",
REG_DWORD,
(LPWSTR)&DwordData,
sizeof(DWORD));
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
#endif
Length = (wcslen(Service->ServiceName) + 1) * sizeof(WCHAR);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"Service",
REG_SZ,
Service->ServiceName,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
NtClose(KeyHandle);
/* Services section */
Status = RtlpGetRegistryHandle(
RTL_REGISTRY_SERVICES,
Service->ServiceName,
TRUE,
&KeyHandle);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlpGetRegistryHandle() failed (Status %x)\n", Status);
return;
}
#ifdef FULLREG
Length = (wcslen(Service->DeviceDesc) + 1) * sizeof(WCHAR);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"DisplayName",
REG_SZ,
Service->DeviceDesc,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
DwordData = 1;
Length = sizeof(DWORD);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"ErrorControl",
REG_DWORD,
(LPWSTR)&DwordData,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
Length = (wcslen(Service->Group) + 1) * sizeof(WCHAR);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"Group",
REG_SZ,
Service->Group,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
#endif
wcscpy(ImagePath, L"\\SystemRoot\\System32\\drivers\\");
wcscat(ImagePath, Service->ServiceName);
wcscat(ImagePath, L".sys");
Length = (wcslen(ImagePath) + 1) * sizeof(WCHAR);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"ImagePath",
REG_SZ,
ImagePath,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
#ifdef FULLREG
DwordData = Service->Start;
Length = sizeof(DWORD);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"Start",
REG_DWORD,
(LPWSTR)&DwordData,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
DwordData = Service->Type;
Length = sizeof(DWORD);
Status = RtlWriteRegistryValue(
RTL_REGISTRY_HANDLE,
(PWSTR)KeyHandle,
L"Type",
REG_DWORD,
(LPWSTR)&DwordData,
Length);
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlWriteRegistryValue() failed (Status %x)\n", Status);
NtClose(KeyHandle);
return;
}
#endif
NtClose(KeyHandle);
}
VOID CreateDefaultRegistry()
{
NTSTATUS Status;
ULONG i;
Status = RtlpCreateRegistryKeyPath(L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\");
if (!NT_SUCCESS(Status))
{
CPRINT("RtlpCreateRegistryKeyPath() (Status %x)\n", Status);
return;
}
Status = RtlpCreateRegistryKeyPath(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
if (!NT_SUCCESS(Status))
{
CPRINT("RtlpCreateRegistryKeyPath() (Status %x)\n", Status);
return;
}
for (i = 0; Services[i].ServiceName != NULL; i++)
{
CreateDefaultRegistryForLegacyDriver(&Services[i]);
}
}
static BOOLEAN
RtlpCheckFileNameExtension(PCHAR FileName,
PCHAR Extension)
@ -963,6 +667,9 @@ ExpInitializeExecutive(VOID)
}
}
/* Initialize volatile registry settings */
CmInit2((PCHAR)KeLoaderBlock.CommandLine);
/*
* Enter the kernel debugger before starting up the boot drivers
*/
@ -1010,10 +717,6 @@ ExpInitializeExecutive(VOID)
#endif /* DBGPRINT_FILE_LOG */
#if 0
CreateDefaultRegistry();
#endif
PiInitDefaultLocale();
/*

View file

@ -1,4 +1,4 @@
/* $Id: loader.c,v 1.112 2002/06/14 07:46:02 ekohl Exp $
/* $Id: loader.c,v 1.113 2002/06/16 11:44:34 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -244,38 +244,6 @@ LdrInitModuleManagement(VOID)
}
/*
* load the auto config drivers.
*/
#if 0
static VOID
LdrLoadAutoConfigDriver(LPWSTR RelativeDriverName)
{
WCHAR TmpFileName [MAX_PATH];
CHAR Buffer [256];
UNICODE_STRING DriverName;
ULONG x, y, cx, cy;
HalQueryDisplayParameters(&x, &y, &cx, &cy);
RtlFillMemory(Buffer, x, ' ');
Buffer[x] = '\0';
HalSetDisplayParameters(0, y-1);
HalDisplayString(Buffer);
sprintf(Buffer, "Loading %S...\n",RelativeDriverName);
HalSetDisplayParameters(0, y-1);
HalDisplayString(Buffer);
HalSetDisplayParameters(cx, cy);
//CPRINT("Loading %S\n",RelativeDriverName);
wcscpy(TmpFileName, L"\\SystemRoot\\system32\\drivers\\");
wcscat(TmpFileName, RelativeDriverName);
RtlInitUnicodeString (&DriverName, TmpFileName);
NtLoadDriver(&DriverName);
}
#endif
#ifdef KDBG
BOOLEAN LdrpReadLine(PCHAR Line,
@ -426,10 +394,10 @@ PSYMBOL LdrpParseLine(PCHAR Line,
return Symbol;
}
VOID LdrpLoadModuleSymbolsFromBuffer(
PMODULE_OBJECT ModuleObject,
PVOID Buffer,
ULONG Length)
VOID
LdrpLoadModuleSymbolsFromBuffer(PMODULE_OBJECT ModuleObject,
PVOID Buffer,
ULONG Length)
/*
Symbols must be sorted by address, e.g.
"nm --numeric-sort module.sys > module.sym"
@ -486,10 +454,11 @@ VOID LdrpLoadModuleSymbolsFromBuffer(
}
}
VOID LdrpLoadUserModuleSymbolsFromBuffer(
PLDR_MODULE ModuleObject,
PVOID Buffer,
ULONG Length)
VOID
LdrpLoadUserModuleSymbolsFromBuffer(PLDR_MODULE ModuleObject,
PVOID Buffer,
ULONG Length)
/*
Symbols must be sorted by address, e.g.
"nm --numeric-sort module.dll > module.sym"
@ -539,6 +508,7 @@ VOID LdrpLoadUserModuleSymbolsFromBuffer(
}
}
VOID
LdrpLoadModuleSymbols(PMODULE_OBJECT ModuleObject)
{
@ -642,7 +612,9 @@ LdrpLoadModuleSymbols(PMODULE_OBJECT ModuleObject)
ExFreePool(FileBuffer);
}
VOID LdrLoadUserModuleSymbols(PLDR_MODULE ModuleObject)
VOID
LdrLoadUserModuleSymbols(PLDR_MODULE ModuleObject)
{
FILE_STANDARD_INFORMATION FileStdInfo;
OBJECT_ATTRIBUTES ObjectAttributes;
@ -743,100 +715,16 @@ VOID LdrLoadUserModuleSymbols(PLDR_MODULE ModuleObject)
ExFreePool(FileBuffer);
}
#endif /* KDBG */
#if 0
VOID LdrLoadAutoConfigDrivers (VOID)
VOID
LdrpUnloadModuleSymbols(PMODULE_OBJECT ModuleObject)
{
#ifdef KDBG
NTSTATUS Status;
UNICODE_STRING ModuleName;
PMODULE_OBJECT ModuleObject;
/* Load symbols for ntoskrnl.exe and hal.dll because \SystemRoot
is created after their module entries */
RtlInitUnicodeString(&ModuleName, KERNEL_MODULE_NAME);
Status = LdrFindModuleObject(&ModuleName, &ModuleObject);
if (NT_SUCCESS(Status))
{
LdrpLoadModuleSymbols(ModuleObject);
}
RtlInitUnicodeString(&ModuleName, HAL_MODULE_NAME);
Status = LdrFindModuleObject(&ModuleName, &ModuleObject);
if (NT_SUCCESS(Status))
{
LdrpLoadModuleSymbols(ModuleObject);
}
/* FIXME: implement me! */
}
#endif /* KDBG */
/*
* PCI bus driver
*/
//LdrLoadAutoConfigDriver( L"pci.sys" );
/*
* Keyboard driver
*/
LdrLoadAutoConfigDriver( L"keyboard.sys" );
if ((KdDebuggerEnabled) && (KdDebugState & KD_DEBUG_PICE))
{
/*
* Private ICE debugger
*/
LdrLoadAutoConfigDriver( L"pice.sys" );
}
/*
* Raw console driver
*/
LdrLoadAutoConfigDriver( L"blue.sys" );
/*
*
*/
LdrLoadAutoConfigDriver(L"vidport.sys");
#if 0
/*
* Minix filesystem driver
*/
LdrLoadAutoConfigDriver(L"minixfs.sys");
/*
* Mailslot filesystem driver
*/
LdrLoadAutoConfigDriver(L"msfs.sys");
#endif
/*
* Named pipe filesystem driver
*/
LdrLoadAutoConfigDriver(L"npfs.sys");
/*
* Mouse drivers
*/
// LdrLoadAutoConfigDriver(L"l8042prt.sys");
LdrLoadAutoConfigDriver(L"psaux.sys");
LdrLoadAutoConfigDriver(L"mouclass.sys");
/*
* Networking
*/
#if 1
/*
* NDIS library
*/
LdrLoadAutoConfigDriver(L"ndis.sys");
#endif
}
#endif
NTSTATUS
LdrpLoadImage(PUNICODE_STRING DriverName,
@ -1029,7 +917,7 @@ LdrUnloadModule(PMODULE_OBJECT ModuleObject)
#ifdef KDBG
/* Unload symbols for module if available */
// LdrpUnloadModuleSymbols(Module);
LdrpUnloadModuleSymbols(ModuleObject);
#endif /* KDBG */
/* Free text section */
@ -1072,8 +960,7 @@ LdrInitializeBootStartDriver(PVOID ModuleLoadBase,
CHAR TmpBaseName[MAX_PATH];
CHAR TmpFileName[MAX_PATH];
ANSI_STRING AnsiString;
ULONG Length;
PCHAR Ext;
PCHAR FileExt;
#endif
HalQueryDisplayParameters(&x, &y, &cx, &cy);
@ -1089,13 +976,13 @@ LdrInitializeBootStartDriver(PVOID ModuleLoadBase,
#ifdef KDBG
/* Split the filename into base name and extension */
Ext = strrchr(FileName, '.');
if (Ext != NULL)
Length = Ext - FileName;
FileExt = strrchr(FileName, '.');
if (FileExt != NULL)
Length = FileExt - FileName;
else
Length = strlen(FileName);
if ((Ext != NULL) && (strcmp(Ext, ".sym") == 0))
if ((FileExt != NULL) && (strcmp(FileExt, ".sym") == 0))
{
DPRINT("Module %s is a symbol file\n", FileName);
@ -1111,18 +998,18 @@ LdrInitializeBootStartDriver(PVOID ModuleLoadBase,
DPRINT("dasdsad: %s\n", TmpFileName);
RtlAnsiStringToUnicodeString(&ModuleName, &AnsiString, TRUE);
Status = LdrFindModuleObject(&ModuleName, &ModuleObject);
ModuleObject = LdrGetModuleObject(&ModuleName);
RtlFreeUnicodeString(&ModuleName);
if (!NT_SUCCESS(Status))
if (ModuleObject == NULL)
{
strcpy(TmpFileName, TmpBaseName);
strcat(TmpFileName, ".exe");
RtlInitAnsiString(&AnsiString, TmpFileName);
RtlAnsiStringToUnicodeString(&ModuleName, &AnsiString, TRUE);
Status = LdrFindModuleObject(&ModuleName, &ModuleObject);
ModuleObject = LdrGetModuleObject(&ModuleName);
RtlFreeUnicodeString(&ModuleName);
}
if (NT_SUCCESS(Status))
if (ModuleObject != NULL)
{
LdrpLoadModuleSymbolsFromBuffer(ModuleObject,
ModuleLoadBase,

View file

@ -40,9 +40,9 @@ REGEDIT4
[\Registry\Machine\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder]
"List"=multi:"SCSI Port", "SCSI Miniport", "Primary Disk", "SCSI Class Helper", \
"SCSI Class", "Boot File System", "Base", "Pointer Port", \
"Keyboard Port", "Pointer Class", "Keyboard Class", "Video Init", \
"Video", "File System", "Event log", "NDIS", "PNP_TDI", "TDI", \
"Extended Base"
"Keyboard Port", "Pointer Class", "Keyboard Class", "Debug", \
"Video Init", "Video", "File System", "Event log", "NDIS", \
"PNP_TDI", "TDI", "Extended Base"
[\Registry\Machine\SYSTEM\CurrentControlSet\Control\Session Manager]
"BootExecute"=multi:"autocheck autochk *"
@ -200,6 +200,13 @@ REGEDIT4
"Start"=dword:00000001
"Type"=dword:00000001
[\Registry\Machine\SYSTEM\CurrentControlSet\Services\Pice]
"ErrorControl"=dword:00000000
"Group"="Debug"
"ImagePath"="system32\drivers\pice.sys"
"Start"=dword:00000004
"Type"=dword:00000001
[\Registry\Machine\SYSTEM\CurrentControlSet\Services\Scsiport]
"ErrorControl"=dword:00000000
"Group"="SCSI Port"