Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
7b6651a9
Commit
7b6651a9
authored
Apr 23, 2004
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Moved creation of the CDROM registry keys into the registry loading
code.
parent
50ce0844
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
174 additions
and
156 deletions
+174
-156
cdrom.c
dlls/ntdll/cdrom.c
+2
-142
ntdll.spec
dlls/ntdll/ntdll.spec
+0
-1
drive.c
files/drive.c
+0
-12
registry.c
misc/registry.c
+172
-1
No files found.
dlls/ntdll/cdrom.c
View file @
7b6651a9
...
...
@@ -377,8 +377,6 @@ static void CDROM_ClearCacheEntry(int dev)
* number of the device on that interface for ide cdroms (*port == 0).
* Determines the scsi information for scsi cdroms (*port >= 1).
* 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
)
{
...
...
@@ -421,8 +419,7 @@ static int CDROM_GetInterfaceInfo(int fd, int* port, int* iface, int* device,int
else
#endif
{
FIXME
(
"CD-ROM device (%d, %d) not supported
\n
"
,
major
(
st
.
st_rdev
),
minor
(
st
.
st_rdev
));
WARN
(
"CD-ROM device (%d, %d) not supported
\n
"
,
major
(
st
.
st_rdev
),
minor
(
st
.
st_rdev
));
return
0
;
}
}
...
...
@@ -458,143 +455,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
*
*/
...
...
@@ -1721,7 +1581,7 @@ NTSTATUS CDROM_DeviceIoControl(HANDLE hDevice,
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
)))
{
wine_server_release_fd
(
hDevice
,
fd
);
...
...
dlls/ntdll/ntdll.spec
View file @
7b6651a9
...
...
@@ -1129,7 +1129,6 @@
################################################################
# Wine dll separation hacks, these will go away, don't use them
#
@ cdecl CDROM_InitRegistry(long)
@ cdecl MODULE_DllThreadAttach(ptr)
@ cdecl MODULE_GetLoadOrderW(ptr wstr wstr)
@ cdecl VERSION_Init(wstr)
...
...
files/drive.c
View file @
7b6651a9
...
...
@@ -100,8 +100,6 @@ inline static char *heap_strdup( const char *str )
return
p
;
}
extern
void
CDROM_InitRegistry
(
int
dev
);
/***********************************************************************
* DRIVE_GetDriveType
*/
...
...
@@ -270,16 +268,6 @@ int DRIVE_Init(void)
len
=
WideCharToMultiByte
(
CP_UNIXCP
,
0
,
data
,
-
1
,
NULL
,
0
,
NULL
,
NULL
);
drive
->
device
=
HeapAlloc
(
GetProcessHeap
(),
0
,
len
);
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 */
...
...
misc/registry.c
View file @
7b6651a9
...
...
@@ -50,6 +50,12 @@
#ifdef HAVE_SYS_MMAN_H
# include <sys/mman.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#ifdef HAVE_LINUX_HDREG_H
# include <linux/hdreg.h>
#endif
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
...
...
@@ -57,6 +63,8 @@
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "winioctl.h"
#include "ntddscsi.h"
#include "wine/winbase16.h"
#include "wine/library.h"
...
...
@@ -1213,7 +1221,7 @@ static void load_wine_registry(HKEY hkey,LPCSTR fn)
attr
.
Length
=
sizeof
(
attr
);
attr
.
RootDirectory
=
0
;
attr
.
Attributes
=
OBJ_CASE_INSENSITIVE
;
attr
.
Attributes
=
0
;
attr
.
ObjectName
=
&
name
;
attr
.
SecurityDescriptor
=
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) */
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
);
/* create hardware registry branch */
create_hardware_branch
();
/* setup registry saving */
all
=
FALSE
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment