Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
6880b4d1
Commit
6880b4d1
authored
Jul 22, 2009
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mountmgr: Use set_volume_info to update the volume when creating a new drive.
parent
e38aff41
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
19 additions
and
50 deletions
+19
-50
device.c
dlls/mountmgr.sys/device.c
+19
-50
No files found.
dlls/mountmgr.sys/device.c
View file @
6880b4d1
...
@@ -427,24 +427,14 @@ static NTSTATUS set_volume_info( struct volume *volume, struct dos_drive *drive,
...
@@ -427,24 +427,14 @@ static NTSTATUS set_volume_info( struct volume *volume, struct dos_drive *drive,
/* set or change the drive letter for an existing drive */
/* set or change the drive letter for an existing drive */
static
void
set_drive_letter
(
struct
dos_drive
*
drive
,
int
letter
)
static
void
set_drive_letter
(
struct
dos_drive
*
drive
,
int
letter
)
{
{
void
*
id
=
NULL
;
unsigned
int
id_len
=
0
;
struct
volume
*
volume
=
drive
->
volume
;
struct
volume
*
volume
=
drive
->
volume
;
struct
disk_device
*
device
=
volume
->
device
;
if
(
drive
->
drive
==
letter
)
return
;
if
(
drive
->
drive
==
letter
)
return
;
if
(
drive
->
mount
)
delete_mount_point
(
drive
->
mount
);
if
(
drive
->
mount
)
delete_mount_point
(
drive
->
mount
);
if
(
volume
->
mount
)
delete_mount_point
(
volume
->
mount
);
if
(
volume
->
mount
)
delete_mount_point
(
volume
->
mount
);
drive
->
drive
=
letter
;
drive
->
drive
=
letter
;
drive
->
mount
=
add_dosdev_mount_point
(
device
->
dev_obj
,
&
device
->
name
,
letter
);
drive
->
mount
=
NULL
;
volume
->
mount
=
add_volume_mount_point
(
device
->
dev_obj
,
&
device
->
name
,
&
volume
->
guid
);
volume
->
mount
=
NULL
;
if
(
device
->
unix_mount
)
{
id
=
device
->
unix_mount
;
id_len
=
strlen
(
device
->
unix_mount
)
+
1
;
}
if
(
drive
->
mount
)
set_mount_point_id
(
drive
->
mount
,
id
,
id_len
);
if
(
volume
->
mount
)
set_mount_point_id
(
volume
->
mount
,
id
,
id_len
);
}
}
static
inline
int
is_valid_device
(
struct
stat
*
st
)
static
inline
int
is_valid_device
(
struct
stat
*
st
)
...
@@ -531,34 +521,6 @@ done:
...
@@ -531,34 +521,6 @@ done:
return
drive
;
return
drive
;
}
}
static
void
set_unix_mount_point
(
struct
dos_drive
*
drive
,
const
char
*
mount_point
)
{
char
*
path
,
*
p
;
struct
volume
*
volume
=
drive
->
volume
;
struct
disk_device
*
device
=
volume
->
device
;
if
(
!
(
path
=
get_dosdevices_path
(
&
p
)))
return
;
p
[
0
]
=
'a'
+
drive
->
drive
;
p
[
2
]
=
0
;
update_symlink
(
path
,
mount_point
,
device
->
unix_mount
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
device
->
unix_mount
);
device
->
unix_mount
=
strdupA
(
mount_point
);
if
(
mount_point
&&
mount_point
[
0
])
{
if
(
drive
->
mount
)
set_mount_point_id
(
drive
->
mount
,
mount_point
,
strlen
(
mount_point
)
+
1
);
if
(
volume
->
mount
)
set_mount_point_id
(
volume
->
mount
,
mount_point
,
strlen
(
mount_point
)
+
1
);
}
else
{
if
(
drive
->
mount
)
set_mount_point_id
(
drive
->
mount
,
NULL
,
0
);
if
(
volume
->
mount
)
set_mount_point_id
(
volume
->
mount
,
NULL
,
0
);
}
HeapFree
(
GetProcessHeap
(),
0
,
path
);
}
/* create devices for mapped drives */
/* create devices for mapped drives */
static
void
create_drive_devices
(
void
)
static
void
create_drive_devices
(
void
)
{
{
...
@@ -653,18 +615,23 @@ NTSTATUS remove_volume( const char *udi )
...
@@ -653,18 +615,23 @@ NTSTATUS remove_volume( const char *udi )
NTSTATUS
add_dos_device
(
int
letter
,
const
char
*
udi
,
const
char
*
device
,
NTSTATUS
add_dos_device
(
int
letter
,
const
char
*
udi
,
const
char
*
device
,
const
char
*
mount_point
,
enum
device_type
type
,
const
GUID
*
guid
)
const
char
*
mount_point
,
enum
device_type
type
,
const
GUID
*
guid
)
{
{
char
*
path
,
*
p
;
NTSTATUS
status
=
STATUS_SUCCESS
;
struct
dos_drive
*
drive
,
*
next
;
struct
dos_drive
*
drive
,
*
next
;
if
(
!
(
path
=
get_dosdevices_path
(
&
p
)))
return
STATUS_NO_MEMORY
;
if
(
letter
==
-
1
)
/* auto-assign a letter */
if
(
letter
==
-
1
)
/* auto-assign a letter */
{
{
letter
=
add_drive
(
device
,
type
);
letter
=
add_drive
(
device
,
type
);
if
(
letter
==
-
1
)
return
STATUS_OBJECT_NAME_COLLISION
;
if
(
letter
==
-
1
)
{
status
=
STATUS_OBJECT_NAME_COLLISION
;
goto
done
;
}
}
}
else
/* simply reset the device symlink */
else
/* simply reset the device symlink */
{
{
char
*
path
,
*
p
;
if
(
!
(
path
=
get_dosdevices_path
(
&
p
)))
return
STATUS_NO_MEMORY
;
*
p
=
'a'
+
letter
;
*
p
=
'a'
+
letter
;
update_symlink
(
path
,
device
,
NULL
);
update_symlink
(
path
,
device
,
NULL
);
}
}
...
@@ -680,15 +647,15 @@ NTSTATUS add_dos_device( int letter, const char *udi, const char *device,
...
@@ -680,15 +647,15 @@ NTSTATUS add_dos_device( int letter, const char *udi, const char *device,
if
(
drive
->
drive
==
letter
)
delete_dos_device
(
drive
);
if
(
drive
->
drive
==
letter
)
delete_dos_device
(
drive
);
}
}
if
(
create_dos_device
(
udi
,
type
,
&
drive
))
return
STATUS_NO_MEMORY
;
if
(
(
status
=
create_dos_device
(
udi
,
type
,
&
drive
)))
goto
done
;
found:
found:
if
(
!
guid
)
guid
=
get_default_uuid
(
letter
);
if
(
!
guid
)
guid
=
get_default_uuid
(
letter
);
drive
->
volume
->
guid
=
*
guid
;
p
[
0
]
=
'a'
+
drive
->
drive
;
RtlFreeHeap
(
GetProcessHeap
(),
0
,
drive
->
volume
->
device
->
unix_device
)
;
p
[
2
]
=
0
;
drive
->
volume
->
device
->
unix_device
=
strdupA
(
device
);
update_symlink
(
path
,
mount_point
,
drive
->
volume
->
device
->
unix_mount
);
set_drive_letter
(
drive
,
letter
);
set_drive_letter
(
drive
,
letter
);
set_
unix_mount_point
(
drive
,
mount_point
);
set_
volume_info
(
drive
->
volume
,
drive
,
device
,
mount_point
,
type
,
guid
);
if
(
drive
->
drive
!=
-
1
)
if
(
drive
->
drive
!=
-
1
)
{
{
...
@@ -716,7 +683,9 @@ found:
...
@@ -716,7 +683,9 @@ found:
if
(
udi
)
send_notify
(
drive
->
drive
,
DBT_DEVICEARRIVAL
);
if
(
udi
)
send_notify
(
drive
->
drive
,
DBT_DEVICEARRIVAL
);
}
}
return
STATUS_SUCCESS
;
done:
RtlFreeHeap
(
GetProcessHeap
(),
0
,
path
);
return
status
;
}
}
/* remove an existing dos drive, by letter or udi */
/* remove an existing dos drive, by letter or udi */
...
...
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