2

I have a Marvell driver that in earlier versions of Windows showed a "Policies" tab in the Properties of it in the Device Manager, but not anymore in Windows 8/8.1.

It is something like this:

While it renders fine in Windows 7 and Vista, in Windows 8 this new tab is not present. I dug up and the main culprit(?) is mv91xxm.dll, which handles the dialog box. A decompiler (NikPEViewer) showed me a MFC icon, an export called ESATAPortPropPageProvider, and that its original name was hotplug.exe once. Those lazy programmers at Marvell forgot to update this file since 2009.

The main utility of this dialog is to enable Driver Cache Mode in the Marvell Controller and disable the "Safely Removal" behavior in Windows (for drives connected to the controller).

I don't know how to fix the problem, nor know if updates or creates a registry key (I guess is something in HKLM\System\CurrentControlSet\Services\mvs91xx) or edits some file whatever is.

Any kind of help is appreciated.

Note: I uploaded the drivers to Mega, in case you want to dig.

[Update 01-05-2014]

I emailed Marvell through the official website, and while they are the makers of the drivers, they don't provide support for drivers that aren't available to download in their website

Dear valued customer, The only approved drivers that Marvell releases to end-users are located on our website:

http://www.marvell.com/support/downloads/search.do

If the driver you are looking for is not here, then we do not provide it.

The drivers that are located on our website are the only support we provide to end-users > (customers that do not have NDAs with Marvell).

If you have any other support needs, please kindly contact the manufacturer of your computer. Thank You

Using the trick to add TreatAsInternalPort registry key doesn't work, basically because the ports aren't managed by the default Microsoft driver for AHCI. My gut says that also is because Microsoft changed the configuration values of these drivers in Windows 8.

3
+100

Analysis

I don't have the same hardware nor I use Windows 8.x, so what I'm going to provide is some static analysis.

Strings

At first I scanned the 64-bit mvs91xx.dll library file using the Strings utility.

Strings just scans the file you pass it for UNICODE (or ASCII) strings of a default length of 3 or more UNICODE (or ASCII) characters.

Source: Strings

Here's the full output:

!This program cannot be run in DOS mode.
Rich
.text
`.data
.pdata
@.rsrc
@.reloc
EEE
('8PW
700PP
```hhh
xppwpp
SeShutdownPrivilege
Change Cahce Module Policy
You must restart your computer before the new settings will take effect.
 Do you want to restart your computer now?
RSDS
d:\project\2013_10\magni_svn\windows\win\sys\amd64\mv91xxm.pdb
%f&
B@H
L$ H
D$ `
D$(H
D$$
D$HH
D$0f
D$XH
\$P
s I
NtH
(tL
t?3
\$0H
t$8H
D$PD
D$1
D$3A
T$0A
8M;
t.H
|$8H+
T$0H
tJH
0t4H
|$8H
L$0
D$(
D$ 
|$0H
D$0D
L$(H
D$ 
L$PH3
\$`I
s I
d$X
d$P
!D$0
D$T
D$4
D$8
D$<
D$X
D$PH
D$PH
L$XH
d$(
d$ 
D$0A
D$4
D$0
D$<
L$X
D$0
d$ 
%L!
u'H
d$ 
d$ 
tUH
D$(
D$ 
L$0H3
\$XH
D$(
D$ 
D$4H
D$(H
D$@E3
D$4P
D$ 
D$4H
D$(H
D$0E3
D$4
D$ 
L$0
L$0
L$@
L$@
ATH
d$ 
t2M
d$ 
t$@H
0A\
VWATAUAVH
t7H
t!H
\$PH
l$XH
 A^A]A\_^
SVWH
\$ 
\$ 
uxH
D$ 
\$ 
t/L
D$ 
\$ 
D$ 
\$ 
uoE3
\$ E3
\$ H
\$ 
uaL
D$ 
\$ 
D$ 
\$ 
_^[
\$0H
t$8H
@SH
McP
A8H
HcH<H
9PE
f9Q
LcA<E3
(E;
t"M+
d$0
L$0
\$0
L$8D
\$8L3
\$@H
\$XE3
T$`H
L$X
D$PH
|$P
tAH
D$8
D$HH
D$0H
D$@H
D$(H
D$ L
L$PL
D$XH
T$`3
D$hH
D$p3
@UH
EP=csm
E0H
@UH
Ep=csm
E8H
@UH
E`=csm
EHH
@UH
=csm
E$H
@UH
E(=csm
E4H
@UH
E@=csm
ELH
@UH
EX=csm
EhH
@UH
Ex=csm
@UH
@UH
pd 
pd 
strchr
atol
_XcptFilter
malloc
_initterm
free
_amsg_exit
__C_specific_handler
msvcrt.dll
SetupDiOpenDevRegKey
SETUPAPI.dll
HeapAlloc
GetCurrentProcess
HeapFree
GetProcessHeap
GetLastError
DisableThreadLibraryCalls
OutputDebugStringA
CloseHandle
LocalFree
Sleep
RtlVirtualUnwind
RtlLookupFunctionEntry
RtlCaptureContext
QueryPerformanceCounter
GetTickCount
GetCurrentThreadId
GetCurrentProcessId
GetSystemTimeAsFileTime
TerminateProcess
UnhandledExceptionFilter
SetUnhandledExceptionFilter
KERNEL32.dll
OpenProcessToken
RegSetValueExA
RegQueryValueExA
LookupPrivilegeValueA
AdjustTokenPrivileges
RegCloseKey
InitiateSystemShutdownExA
ADVAPI32.dll
EnableWindow
SetWindowLongPtrA
GetDlgItem
MessageBoxA
GetFocus
SendDlgItemMessageA
GetWindowLongPtrA
USER32.dll
DestroyPropertySheetPage
CreatePropertySheetPageA
COMCTL32.dll
MVCOINST.dll
ESATAPortPropPageProvider
N@ 
kU'9
&D(
HMXB
9;5
?q=
?Zd;
?3=
?/L[
S;uD
?$#
;1a
z?aUY
D?$?
*?}
d|F
U>c{
#Tw
zc%C1
.:3q
,%I
-64OS
NKeb
eSATAport
MatchingDeviceId
eSATAportCount
DriverPolicySet
0123
wwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwww
www
wwww
wwwwwwwwwww}
wwwwwwww
wwwwwwwwwwwwww
wwwwwwwwwwwwww
wwwwwww}
wwww
wwwwwww}x
}wwwwwww}
wwww
wXk
qN]
tno
<sa
_`__``_``a`_`_aaaa`
     !        !     
i\\\\\\\\[\\\\\\\[\\a///2/////////2/22///
i\^
da2/
BB<<<<777111,,,*/
i\^
na2/
RFGHJCDKLL=>>88+/
h\^
}qq
[`//"QRT$
1=>>8+2
j\^
sccy
\`2/"OQ
$%=>>*2
i\^
sccy
\a//"NO
66**
L=>(2
i\]~
rccy
\a//"WN
FTHI*++LL=(/
h\^|~
rccs
\`//'VW
RFTHJCDKLL)2
j\]x|~
rccp~
\_//'VV
QRFTHJCDKL(/
i\^wx|~pcccccb
\`//'UV
OQRFGHJCDK(/
i\]wwx|pcckrss
\a//0UU
NOQRSGHIJD(2
i\^vwwxpccr
\`///YU
WNOQRFTHIJ)/
j\]uvwwmccp
\`//9YY
VWNO5;*THI)2
j\]uuvwmccp
\a//9XY
VVWN
STH)2
i\]ouuvmccbbbbbs
\a//@XX0
RST)/
i\]oouulefffggkt
\`/2@ZXX:
;NPRF(/
h\]loouuvwwx|~
\_2/@ZZXXYYUUUVWNOPQ(/
i\]ffggkkqqqzzz{{{
\_//?MMMMEEEAAAA3345
i\\\\\\\\\\\\\\\\\\\`//&&&&&--&&&&-&&&&./
illlllllll
##"
nPh
_s-
>w+
3Zz
]ZZZZZZZZZZZWV-1---------1-
mV2.AHBC5D;<<(-
kV2.P:#
!!+=>(-
kV239
$=(-
{co
kV73@
GJ'
0<(-
^e~
xco
kV78@
OGJKD;*1
]d}~wca``
kV78F
OOGJKD*1
\dy}rch{
kV7EF
MNOGIK/1
\buyrcj
kV?EE
RR.#:I/-
[btuncfssv
kV?LE
&%"
9G41
]_ptqhhhjj
kV?LTE
@NO41
]_mptuy}~
lV6SUTTQQQRRN91
[WXXXYXXYXYYWV-)))))))))),,
uVh
_s-
F5><<==.
ECK2LPV.
E@J3MOU.
D?H31IT.
-,%
B;G1JKS.(
E9A011R.&#
E/4678:."&' 
NQWhX^XXXe
rpq
t}~]
djklnoc
sgba`_f|
ux||||
#  #  # 
#! # 
#! #! # 
#  # 
#gdc 
#  #! # 
#  #  # 
#  # 
#  # 
#  #  #  #
! #
t5! #! #
lR! #
.Bu
mS! #
<Bv
lR! #
lR! #
d0_
lR! #
b0`
lR! #
`0_
lR! #
]1`
lR! #
[0_
lR! #
V0_
lR! #
U0_
lR! #
O0_
lR! #
M0_
lR! #
K0_
lR! #
F0_
lR! #
lR! #
lS! #
lR! #
lR! #
b;wi=ua=ua=ua=ua<u`=ua=ua<u`9d[qikunntnntnnunntnnunnunntpwyr
cVgdc
y]q
nkgdc
wYl
gdc
rP`
gdc
oJY
gdc
y|~$s
hJ[
rcgdc
4@egdc
5@fgdc
5@fgdc
4@egdc
5Afgdc
4@egdc
5@fgdc
5@fgdc
4@egdc
4@egdc
5@fgdc
5Afgdc
5@egdc
5@fgdc
BL@BM@BM@BL@BL@BL@BL@BM@CMABM@BL@BL@ 
#w\Rv\Rw]Sw\Rw\Rw\Sv\Rv\Rw\Rw]Sw]Sw]StYQ1-/ 
_s-
t6REE 
F_s-
t6RDD 
<_s-
t5REE 
=^s,
t5RDE 
=_s-
u6RDD 
y0_
=_s-
=REE 
t0_
=^s,
=REE 
j0_
=_s-
=SEE 
f0_
=_s-
=REE 
[0_
>w+^
=^s,
=REE 
=_s-
=SEE 
<^s,
=SEE 
_s-
;tcc 
3ZzWo
vWj
pM\
XBe
4@e
?Ru
CXz
CXz
CYz
CXz
BXz
CXz
CY{
=_s-
|Xfdc
_s-
Zgec
_s-
Zfdc
_s-
Zfdc
y=z
^s-
Zfdc
^<y
_s-
Yfdc
>_s-
vVh
7<K
8<K
7<K
8<K
Policies
MS Shell Dlg
This setting enables driver caching to improve disk performance. This setting will be ignored and un-checked if enabled safely remove disk
Enable driver cache mode.
Note:
The setting will not take effect until you restart system
This setting enables remove disk safely. To disconnect disk from controller, click the Safely Remove Hardware icon in the taskbar notification area.
Enable safely remove disk.
VS_VERSION_INFO
StringFileInfo
040904e4
CompanyName
<Marvell>
FileDescription
Coinstaller
FileVersion
1.0.0.2
InternalName
hotplug.exe
LegalCopyright
2009 (c) <Marvell>.  All rights reserved.
OriginalFilename
hotplug.exe
ProductName
driver feature policy
ProductVersion
1.0.0.2
VarFileInfo
Translation

Unsurprisingly, the result isn't garbage free. I'm going to highlight just the most significant bits.

Library information

While the copyright information wasn't updated since 2009, the file was last modified in October 2013 according to its time stamp. This seems to be confirmed by the build directory embedded in the file:

d:\project\2013_10\magni_svn\windows\win\sys\amd64\mv91xxm.pdb

The .pdb file extension stands for Program Database, a proprietary Microsoft format which stores debugging information. In fact there's also a msvcrt.dll string, meaning the the library was compiled using some version of Microsoft Visual C++.

As a side note, they use(d) Apache Subversion as their software versioning and revision control system.

Windows 8.x compatibility

As the library was updated in October 2013, it's reasonable to think they would provide compatibility with Windows 8, and possibly Windows 8.1 too. Checking the mvs91xx.cat catalog file, here are the details related to the mvs91xx.dll library file:

Tag                     9B1349794EE18ECCCBBD7F38FEEA9D44CC42746E
Thumbprint algorithm    sha1
Thumbprint              9b 13 49 79 4e e1 8e cc cb bd 7f 38 fe ea 9d 44 cc 42 74 6e
OSAttr                  2:6.1,2:6.2,2:6.3
File                    mvs91xx.dll

OSAttr:2:6.0

The OSAttr attribute specifies the target Windows version whose signing requirements are compatible with the driver package. The attribute's value specifies the following:

  • The value 2 specifies the catalog file is compatible with NT-based versions of the Windows operating system.
  • The value 6.0 specifies the catalog file is compatible with Windows Vista.

Note If the driver package is compatible with multiple Windows versions, you must use separate CATATTR options to specify the OSAttr attribute for each Windows version.

Source: Creating a Catalog File for a Non-PnP Driver Package

In this case the OSAttr value includes three NT-based Windows versions: Windows 7 (6.1), Windows 8 (6.2), and Windows 8.1 (6.3). This means the driver package is compatible with Windows 8/8.1, at least on paper; still the Policies pane isn't available in Windows 8.x. Whether the operating system or the library file is to blame, I wouldn't know.

Registry functions

Driver settings are usually stored in the registry, and the library does include some Windows registry functions:

RegSetValueExA
RegQueryValueExA
RegCloseKey

Looking for policy-related strings, I came across DriverPolicySet. By reverse engineering the library I confirmed that the registry functions were indeed used, and that the string mentioned above was part of a registry path being either read or written.


Manual policy tweaking

Searching for "DriverPolicySet" on the web returned few, yet interesting results. In particular a post on a Japanese board and a reply on a Russian forum. By translating and putting together the bits of information, I was able to get a clearer picture - literally.

DriverPolicySet

The DriverPolicySet value is a string (REG_SZ) which can be set to:

  • 0 - Disable all policies.
  • 1 - Enable driver caching only.
  • 2 - Enable safe removal only.
  • 3 - Enable both driver caching and safe removal.

It's usually stored in the following registry key:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E97B-E325-11CE-BFC1-08002BE10318}\0001

Remarks

  • In case the registry value isn't there you'll need to create it yourself.

  • You have to restart the system in order to apply the changes.

  • {4D36E97B-E325-11CE-BFC1-08002BE10318} is the device class GUID assigned to SCSI and RAID controllers. It is defined in the mvs91xx.inf file.

  • The 0001 ending part might be slightly different depending on the number of available controllers. For example, it might be 0000, or 0002, etc. instead.

  • IT WORKED. I REPEAT, IT WORKED. – DarkGhostHunter May 3 '14 at 18:43
  • @DarkGhostHunter I'm glad to hear it. Could you specify where was the registry value stored, exactly? – and31415 May 3 '14 at 18:50
  • Basically, adding "DriverPolicySet" and setting it to "1" made the driver treat the disk has internal ports - thereby, changing it to the other values should enable or disable the requested features. I came out to that reg key before, but I though it wasn't important, though. I think I saw some Russian and Japanese forums, but I didn't dig up that far. Congratulations, you got the bounty. And fixed a very well known problem to Marvell users. Cheers! – DarkGhostHunter May 3 '14 at 19:30
  • @DarkGhostHunter So you had to manually add the DriverPolicySet value, i.e. it wasn't there already? Also, which was the registry path? It looks like the driver package is indeed compatible with Windows 8.x, despite the fact you have to edit the registry value manually. – and31415 May 3 '14 at 19:44
  • It wasn't there from the beginning, so probably Marvell missed the mark there. The registry path was the same, but the ending was 0002 (I have tree controllers). Indeed, the drivers package are compatible, thus the "Policies" tab is the only feature that breaks the whole purpose of mvx91xx.dll. – DarkGhostHunter May 4 '14 at 18:02
2

Explanations

Like you said, they did not update it when they ported the drivers to Windows 8. That said, it’s also possible (possibly even likely) that they chose to remove it from the Windows 8 driver because of a bug and/or incompatibility with Windows 8 and/or due to Windows 8’s different interface design (you normally don’t see the notification-area icon by default).

Solution

Your best bet is to simply contact Marvell and let them know that the tab is missing and request that they update the driver to fix it. Either they will do so, or they will explain specifically why they removed it.

Work-around

In the meantime, if you need the functionality of the page, you can determine exactly which registry entries are set if you have access to a system where it is available (e.g., in Windows 7):

  1. Run Process Monitor
  2. Set it to filter out everything but the registry
  3. Stop the capture and clear the results
  4. Open the Policies tab
  5. Toggle the checkbox
  6. Switch to ProcMon and start the capture
  7. Quickly switch back to the tab
  8. Click [Apply]
  9. Quickly switch back to ProcMon and stop the capture
  10. Look through the registry changes to find the relevant

Alternate Workaround

If you no longer have access to a compatible system (i.e., you cannot install a temporary copy of Windows 7 on your system), then you can try an alternate (and vendor-independent) solution that was mentioned on the page where you found the screenshot you posted in your question (the person who posted has not tested it in Windows 8, but it’s worth a shot if you can’t wait for a response from Marvell):

  1. Navigate to HKLM\SYSTEM\CurrentControlSet\services\msahci
  2. Create a key named Controller0
  3. Create a subkey named Channel0
  4. Create a DWORD named TreatAsInternalPort and set it to 1
  5. Repeat for Channel1, Channel2, etc., and if necessary for Controller1, etc.
  6. Reboot

Here’s a registry script with the default settings that the people in that thread said worked for them:

REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci\Controller0\Channel0]
"TreatAsInternalPort"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci\Controller0\Channel1]
"TreatAsInternalPort"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci\Controller0\Channel2]
"TreatAsInternalPort"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci\Controller0\Channel3]
"TreatAsInternalPort"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci\Controller0\Channel4]
"TreatAsInternalPort"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci\Controller0\Channel5]
"TreatAsInternalPort"=dword:00000001
  • I'll try the alternate workaround. Meanwhile, there it goes the mail to Marvell. – DarkGhostHunter May 1 '14 at 22:08

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.