Moved creation of the CDROM registry keys into the registry loading
code.
This commit is contained in:
parent
50ce0844ba
commit
7b6651a9e1
|
@ -377,8 +377,6 @@ static void CDROM_ClearCacheEntry(int dev)
|
||||||
* number of the device on that interface for ide cdroms (*port == 0).
|
* number of the device on that interface for ide cdroms (*port == 0).
|
||||||
* Determines the scsi information for scsi cdroms (*port >= 1).
|
* Determines the scsi information for scsi cdroms (*port >= 1).
|
||||||
* Returns false if the info cannot not be obtained.
|
* Returns false if the info cannot not be obtained.
|
||||||
*
|
|
||||||
* NOTE: this function is used in CDROM_InitRegistry and CDROM_GetAddress
|
|
||||||
*/
|
*/
|
||||||
static int CDROM_GetInterfaceInfo(int fd, int* port, int* iface, int* device,int* lun)
|
static int CDROM_GetInterfaceInfo(int fd, int* port, int* iface, int* device,int* lun)
|
||||||
{
|
{
|
||||||
|
@ -421,8 +419,7 @@ static int CDROM_GetInterfaceInfo(int fd, int* port, int* iface, int* device,int
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
FIXME("CD-ROM device (%d, %d) not supported\n",
|
WARN("CD-ROM device (%d, %d) not supported\n", major(st.st_rdev), minor(st.st_rdev));
|
||||||
major(st.st_rdev), minor(st.st_rdev));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -457,143 +454,6 @@ static int CDROM_GetInterfaceInfo(int fd, int* port, int* iface, int* device,int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************
|
|
||||||
* CDROM_InitRegistry
|
|
||||||
*
|
|
||||||
* Initializes registry to contain scsi info about the cdrom in NT.
|
|
||||||
* All devices (even not real scsi ones) have this info in NT.
|
|
||||||
* TODO: for now it only works for non scsi devices
|
|
||||||
* NOTE: programs usually read these registry entries after sending the
|
|
||||||
* IOCTL_SCSI_GET_ADDRESS ioctl to the cdrom
|
|
||||||
*/
|
|
||||||
void CDROM_InitRegistry(int fd)
|
|
||||||
{
|
|
||||||
int portnum, busid, targetid, lun;
|
|
||||||
OBJECT_ATTRIBUTES attr;
|
|
||||||
UNICODE_STRING nameW;
|
|
||||||
WCHAR dataW[50];
|
|
||||||
DWORD lenW;
|
|
||||||
char buffer[40];
|
|
||||||
DWORD value;
|
|
||||||
const char *data;
|
|
||||||
HKEY scsiKey;
|
|
||||||
HKEY portKey;
|
|
||||||
HKEY busKey;
|
|
||||||
HKEY targetKey;
|
|
||||||
DWORD disp;
|
|
||||||
|
|
||||||
attr.Length = sizeof(attr);
|
|
||||||
attr.RootDirectory = 0;
|
|
||||||
attr.ObjectName = &nameW;
|
|
||||||
attr.Attributes = 0;
|
|
||||||
attr.SecurityDescriptor = NULL;
|
|
||||||
attr.SecurityQualityOfService = NULL;
|
|
||||||
|
|
||||||
if (!CDROM_GetInterfaceInfo(fd, &portnum, &busid, &targetid, &lun))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Ensure there is Scsi key */
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, "Machine\\HARDWARE\\DEVICEMAP\\Scsi" ) ||
|
|
||||||
NtCreateKey( &scsiKey, KEY_ALL_ACCESS, &attr, 0,
|
|
||||||
NULL, REG_OPTION_VOLATILE, &disp ))
|
|
||||||
{
|
|
||||||
ERR("Cannot create DEVICEMAP\\Scsi registry key\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
|
|
||||||
snprintf(buffer,sizeof(buffer),"Scsi Port %d",portnum);
|
|
||||||
attr.RootDirectory = scsiKey;
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
|
|
||||||
NtCreateKey( &portKey, KEY_ALL_ACCESS, &attr, 0,
|
|
||||||
NULL, REG_OPTION_VOLATILE, &disp ))
|
|
||||||
{
|
|
||||||
ERR("Cannot create DEVICEMAP\\Scsi Port registry key\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
|
|
||||||
RtlCreateUnicodeStringFromAsciiz( &nameW, "Driver" );
|
|
||||||
data = "atapi";
|
|
||||||
RtlMultiByteToUnicodeN( dataW, 50, &lenW, data, strlen(data));
|
|
||||||
NtSetValueKey( portKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
value = 10;
|
|
||||||
RtlCreateUnicodeStringFromAsciiz( &nameW, "FirstBusTimeScanInMs" );
|
|
||||||
NtSetValueKey( portKey,&nameW, 0, REG_DWORD, (BYTE *)&value, sizeof(DWORD));
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
value = 0;
|
|
||||||
#ifdef HDIO_GET_DMA
|
|
||||||
{
|
|
||||||
int dma;
|
|
||||||
if (ioctl(fd,HDIO_GET_DMA, &dma) != -1) {
|
|
||||||
value = dma;
|
|
||||||
TRACE("setting dma to %lx\n", value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
RtlCreateUnicodeStringFromAsciiz( &nameW, "DMAEnabled" );
|
|
||||||
NtSetValueKey( portKey,&nameW, 0, REG_DWORD, (BYTE *)&value, sizeof(DWORD));
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
|
|
||||||
snprintf(buffer,40,"Scsi Bus %d", busid);
|
|
||||||
attr.RootDirectory = portKey;
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
|
|
||||||
NtCreateKey( &busKey, KEY_ALL_ACCESS, &attr, 0,
|
|
||||||
NULL, REG_OPTION_VOLATILE, &disp ))
|
|
||||||
{
|
|
||||||
ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus registry key\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
|
|
||||||
attr.RootDirectory = busKey;
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, "Initiator Id 255" ) ||
|
|
||||||
NtCreateKey( &targetKey, KEY_ALL_ACCESS, &attr, 0,
|
|
||||||
NULL, REG_OPTION_VOLATILE, &disp ))
|
|
||||||
{
|
|
||||||
ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus\\Initiator Id 255 registry key\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
NtClose( targetKey );
|
|
||||||
|
|
||||||
snprintf(buffer,40,"Target Id %d", targetid);
|
|
||||||
attr.RootDirectory = busKey;
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
|
|
||||||
NtCreateKey( &targetKey, KEY_ALL_ACCESS, &attr, 0,
|
|
||||||
NULL, REG_OPTION_VOLATILE, &disp ))
|
|
||||||
{
|
|
||||||
ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus 0\\Target Id registry key\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
|
|
||||||
RtlCreateUnicodeStringFromAsciiz( &nameW, "Type" );
|
|
||||||
data = "CdRomPeripheral";
|
|
||||||
RtlMultiByteToUnicodeN( dataW, 50, &lenW, data, strlen(data));
|
|
||||||
NtSetValueKey( targetKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
/* FIXME - maybe read the real identifier?? */
|
|
||||||
RtlCreateUnicodeStringFromAsciiz( &nameW, "Identifier" );
|
|
||||||
data = "Wine CDROM";
|
|
||||||
RtlMultiByteToUnicodeN( dataW, 50, &lenW, data, strlen(data));
|
|
||||||
NtSetValueKey( targetKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
/* FIXME - we always use Cdrom0 - do not know about the nt behaviour */
|
|
||||||
RtlCreateUnicodeStringFromAsciiz( &nameW, "DeviceName" );
|
|
||||||
data = "Cdrom0";
|
|
||||||
RtlMultiByteToUnicodeN( dataW, 50, &lenW, data, strlen(data));
|
|
||||||
NtSetValueKey( targetKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
|
|
||||||
RtlFreeUnicodeString( &nameW );
|
|
||||||
|
|
||||||
NtClose( targetKey );
|
|
||||||
NtClose( busKey );
|
|
||||||
NtClose( portKey );
|
|
||||||
NtClose( scsiKey );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* CDROM_Open
|
* CDROM_Open
|
||||||
*
|
*
|
||||||
|
@ -1721,7 +1581,7 @@ NTSTATUS CDROM_DeviceIoControl(HANDLE hDevice,
|
||||||
|
|
||||||
piosb->Information = 0;
|
piosb->Information = 0;
|
||||||
|
|
||||||
if ((status = wine_server_handle_to_fd( hDevice, GENERIC_READ, &fd, NULL, NULL ))) goto error;
|
if ((status = wine_server_handle_to_fd( hDevice, 0, &fd, NULL, NULL ))) goto error;
|
||||||
if ((status = CDROM_Open(fd, &dev)))
|
if ((status = CDROM_Open(fd, &dev)))
|
||||||
{
|
{
|
||||||
wine_server_release_fd( hDevice, fd );
|
wine_server_release_fd( hDevice, fd );
|
||||||
|
|
|
@ -1129,7 +1129,6 @@
|
||||||
################################################################
|
################################################################
|
||||||
# Wine dll separation hacks, these will go away, don't use them
|
# Wine dll separation hacks, these will go away, don't use them
|
||||||
#
|
#
|
||||||
@ cdecl CDROM_InitRegistry(long)
|
|
||||||
@ cdecl MODULE_DllThreadAttach(ptr)
|
@ cdecl MODULE_DllThreadAttach(ptr)
|
||||||
@ cdecl MODULE_GetLoadOrderW(ptr wstr wstr)
|
@ cdecl MODULE_GetLoadOrderW(ptr wstr wstr)
|
||||||
@ cdecl VERSION_Init(wstr)
|
@ cdecl VERSION_Init(wstr)
|
||||||
|
|
|
@ -100,8 +100,6 @@ inline static char *heap_strdup( const char *str )
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void CDROM_InitRegistry(int dev);
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DRIVE_GetDriveType
|
* DRIVE_GetDriveType
|
||||||
*/
|
*/
|
||||||
|
@ -270,16 +268,6 @@ int DRIVE_Init(void)
|
||||||
len = WideCharToMultiByte(CP_UNIXCP, 0, data, -1, NULL, 0, NULL, NULL);
|
len = WideCharToMultiByte(CP_UNIXCP, 0, data, -1, NULL, 0, NULL, NULL);
|
||||||
drive->device = HeapAlloc(GetProcessHeap(), 0, len);
|
drive->device = HeapAlloc(GetProcessHeap(), 0, len);
|
||||||
WideCharToMultiByte(CP_UNIXCP, 0, data, -1, drive->device, len, NULL, NULL);
|
WideCharToMultiByte(CP_UNIXCP, 0, data, -1, drive->device, len, NULL, NULL);
|
||||||
|
|
||||||
if (drive->type == DRIVE_CDROM)
|
|
||||||
{
|
|
||||||
int cd_fd;
|
|
||||||
if ((cd_fd = open(drive->device, O_RDONLY|O_NONBLOCK)) != -1)
|
|
||||||
{
|
|
||||||
CDROM_InitRegistry(cd_fd);
|
|
||||||
close(cd_fd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make the first hard disk the current drive */
|
/* Make the first hard disk the current drive */
|
||||||
|
|
173
misc/registry.c
173
misc/registry.c
|
@ -50,6 +50,12 @@
|
||||||
#ifdef HAVE_SYS_MMAN_H
|
#ifdef HAVE_SYS_MMAN_H
|
||||||
# include <sys/mman.h>
|
# include <sys/mman.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_IOCTL_H
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LINUX_HDREG_H
|
||||||
|
# include <linux/hdreg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define NONAMELESSUNION
|
#define NONAMELESSUNION
|
||||||
#define NONAMELESSSTRUCT
|
#define NONAMELESSSTRUCT
|
||||||
|
@ -57,6 +63,8 @@
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
|
#include "winioctl.h"
|
||||||
|
#include "ntddscsi.h"
|
||||||
|
|
||||||
#include "wine/winbase16.h"
|
#include "wine/winbase16.h"
|
||||||
#include "wine/library.h"
|
#include "wine/library.h"
|
||||||
|
@ -1213,7 +1221,7 @@ static void load_wine_registry(HKEY hkey,LPCSTR fn)
|
||||||
|
|
||||||
attr.Length = sizeof(attr);
|
attr.Length = sizeof(attr);
|
||||||
attr.RootDirectory = 0;
|
attr.RootDirectory = 0;
|
||||||
attr.Attributes = OBJ_CASE_INSENSITIVE;
|
attr.Attributes = 0;
|
||||||
attr.ObjectName = &name;
|
attr.ObjectName = &name;
|
||||||
attr.SecurityDescriptor = NULL;
|
attr.SecurityDescriptor = NULL;
|
||||||
attr.SecurityQualityOfService = NULL;
|
attr.SecurityQualityOfService = NULL;
|
||||||
|
@ -1666,6 +1674,165 @@ static void _load_home_registry( HKEY hkey_local_machine, HKEY hkey_current_user
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* init_cdrom_registry
|
||||||
|
*
|
||||||
|
* Initializes registry to contain scsi info about the cdrom in NT.
|
||||||
|
* All devices (even not real scsi ones) have this info in NT.
|
||||||
|
* TODO: for now it only works for non scsi devices
|
||||||
|
* NOTE: programs usually read these registry entries after sending the
|
||||||
|
* IOCTL_SCSI_GET_ADDRESS ioctl to the cdrom
|
||||||
|
*/
|
||||||
|
static void init_cdrom_registry( HANDLE handle )
|
||||||
|
{
|
||||||
|
OBJECT_ATTRIBUTES attr;
|
||||||
|
UNICODE_STRING nameW;
|
||||||
|
WCHAR dataW[50];
|
||||||
|
DWORD lenW;
|
||||||
|
char buffer[40];
|
||||||
|
DWORD value;
|
||||||
|
const char *data;
|
||||||
|
HKEY scsiKey;
|
||||||
|
HKEY portKey;
|
||||||
|
HKEY busKey;
|
||||||
|
HKEY targetKey;
|
||||||
|
DWORD disp;
|
||||||
|
IO_STATUS_BLOCK io;
|
||||||
|
SCSI_ADDRESS scsi_addr;
|
||||||
|
|
||||||
|
if (NtDeviceIoControlFile( handle, 0, NULL, NULL, &io, IOCTL_SCSI_GET_ADDRESS,
|
||||||
|
NULL, 0, &scsi_addr, sizeof(scsi_addr) ))
|
||||||
|
return;
|
||||||
|
|
||||||
|
attr.Length = sizeof(attr);
|
||||||
|
attr.RootDirectory = 0;
|
||||||
|
attr.ObjectName = &nameW;
|
||||||
|
attr.Attributes = 0;
|
||||||
|
attr.SecurityDescriptor = NULL;
|
||||||
|
attr.SecurityQualityOfService = NULL;
|
||||||
|
|
||||||
|
/* Ensure there is Scsi key */
|
||||||
|
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, "Machine\\HARDWARE\\DEVICEMAP\\Scsi" ) ||
|
||||||
|
NtCreateKey( &scsiKey, KEY_ALL_ACCESS, &attr, 0,
|
||||||
|
NULL, REG_OPTION_VOLATILE, &disp ))
|
||||||
|
{
|
||||||
|
ERR("Cannot create DEVICEMAP\\Scsi registry key\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
|
||||||
|
snprintf(buffer,sizeof(buffer),"Scsi Port %d",scsi_addr.PortNumber);
|
||||||
|
attr.RootDirectory = scsiKey;
|
||||||
|
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
|
||||||
|
NtCreateKey( &portKey, KEY_ALL_ACCESS, &attr, 0,
|
||||||
|
NULL, REG_OPTION_VOLATILE, &disp ))
|
||||||
|
{
|
||||||
|
ERR("Cannot create DEVICEMAP\\Scsi Port registry key\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
|
||||||
|
RtlCreateUnicodeStringFromAsciiz( &nameW, "Driver" );
|
||||||
|
data = "atapi";
|
||||||
|
RtlMultiByteToUnicodeN( dataW, 50, &lenW, data, strlen(data));
|
||||||
|
NtSetValueKey( portKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
value = 10;
|
||||||
|
RtlCreateUnicodeStringFromAsciiz( &nameW, "FirstBusTimeScanInMs" );
|
||||||
|
NtSetValueKey( portKey,&nameW, 0, REG_DWORD, (BYTE *)&value, sizeof(DWORD));
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
value = 0;
|
||||||
|
#ifdef HDIO_GET_DMA
|
||||||
|
{
|
||||||
|
int fd, dma;
|
||||||
|
if (!wine_server_handle_to_fd( handle, 0, &fd, NULL, NULL ))
|
||||||
|
{
|
||||||
|
if (ioctl(fd,HDIO_GET_DMA, &dma) != -1) value = dma;
|
||||||
|
wine_server_release_fd( handle, fd );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
RtlCreateUnicodeStringFromAsciiz( &nameW, "DMAEnabled" );
|
||||||
|
NtSetValueKey( portKey,&nameW, 0, REG_DWORD, (BYTE *)&value, sizeof(DWORD));
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
|
||||||
|
snprintf(buffer,40,"Scsi Bus %d", scsi_addr.PathId);
|
||||||
|
attr.RootDirectory = portKey;
|
||||||
|
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
|
||||||
|
NtCreateKey( &busKey, KEY_ALL_ACCESS, &attr, 0,
|
||||||
|
NULL, REG_OPTION_VOLATILE, &disp ))
|
||||||
|
{
|
||||||
|
ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus registry key\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
|
||||||
|
attr.RootDirectory = busKey;
|
||||||
|
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, "Initiator Id 255" ) ||
|
||||||
|
NtCreateKey( &targetKey, KEY_ALL_ACCESS, &attr, 0,
|
||||||
|
NULL, REG_OPTION_VOLATILE, &disp ))
|
||||||
|
{
|
||||||
|
ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus\\Initiator Id 255 registry key\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
NtClose( targetKey );
|
||||||
|
|
||||||
|
snprintf(buffer,40,"Target Id %d", scsi_addr.TargetId);
|
||||||
|
attr.RootDirectory = busKey;
|
||||||
|
if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
|
||||||
|
NtCreateKey( &targetKey, KEY_ALL_ACCESS, &attr, 0,
|
||||||
|
NULL, REG_OPTION_VOLATILE, &disp ))
|
||||||
|
{
|
||||||
|
ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus 0\\Target Id registry key\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
|
||||||
|
RtlCreateUnicodeStringFromAsciiz( &nameW, "Type" );
|
||||||
|
data = "CdRomPeripheral";
|
||||||
|
RtlMultiByteToUnicodeN( dataW, 50, &lenW, data, strlen(data));
|
||||||
|
NtSetValueKey( targetKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
/* FIXME - maybe read the real identifier?? */
|
||||||
|
RtlCreateUnicodeStringFromAsciiz( &nameW, "Identifier" );
|
||||||
|
data = "Wine CDROM";
|
||||||
|
RtlMultiByteToUnicodeN( dataW, 50, &lenW, data, strlen(data));
|
||||||
|
NtSetValueKey( targetKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
/* FIXME - we always use Cdrom0 - do not know about the nt behaviour */
|
||||||
|
RtlCreateUnicodeStringFromAsciiz( &nameW, "DeviceName" );
|
||||||
|
data = "Cdrom0";
|
||||||
|
RtlMultiByteToUnicodeN( dataW, 50, &lenW, data, strlen(data));
|
||||||
|
NtSetValueKey( targetKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
|
||||||
|
RtlFreeUnicodeString( &nameW );
|
||||||
|
|
||||||
|
NtClose( targetKey );
|
||||||
|
NtClose( busKey );
|
||||||
|
NtClose( portKey );
|
||||||
|
NtClose( scsiKey );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* create the hardware registry branch */
|
||||||
|
static void create_hardware_branch(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
HANDLE handle;
|
||||||
|
char drive[] = "\\\\.\\A:";
|
||||||
|
|
||||||
|
/* create entries for cdroms */
|
||||||
|
for (i = 0; i < 26; i++)
|
||||||
|
{
|
||||||
|
drive[4] = 'A' + i;
|
||||||
|
handle = CreateFileA( drive, 0, 0, NULL, OPEN_EXISTING, 0, 0 );
|
||||||
|
if (handle == INVALID_HANDLE_VALUE) continue;
|
||||||
|
init_cdrom_registry( handle );
|
||||||
|
CloseHandle( handle );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* load all registry (native and global and home) */
|
/* load all registry (native and global and home) */
|
||||||
void SHELL_LoadRegistry( void )
|
void SHELL_LoadRegistry( void )
|
||||||
{
|
{
|
||||||
|
@ -1794,6 +1961,10 @@ void SHELL_LoadRegistry( void )
|
||||||
}
|
}
|
||||||
if (res) _load_home_registry( hkey_local_machine, hkey_current_user, hkey_users_default );
|
if (res) _load_home_registry( hkey_local_machine, hkey_current_user, hkey_users_default );
|
||||||
|
|
||||||
|
/* create hardware registry branch */
|
||||||
|
|
||||||
|
create_hardware_branch();
|
||||||
|
|
||||||
/* setup registry saving */
|
/* setup registry saving */
|
||||||
|
|
||||||
all = FALSE;
|
all = FALSE;
|
||||||
|
|
Loading…
Reference in New Issue