const CHAR *Reason;
BOOLEAN Removable;
+ BOOLEAN Ejectable;
PULONG Revision;
PWCHAR *Description;
goto done;
(VOID) RegistryQueryDwordValue(Key,
- "Removable",
+ "AllowPdoRemove",
&Value);
RegistryCloseKey(Key);
return Pdo->Removable;
}
+static FORCEINLINE VOID
+__PdoSetEjectable(
+ IN PXENBUS_PDO Pdo
+ )
+{
+ HANDLE ParametersKey;
+ HANDLE Key;
+ ULONG Value;
+ NTSTATUS status;
+
+ Value = 1;
+
+ ParametersKey = DriverGetParametersKey();
+
+ status = RegistryOpenSubKey(ParametersKey,
+ __PdoGetName(Pdo),
+ KEY_READ,
+ &Key);
+ if (!NT_SUCCESS(status))
+ goto done;
+
+ (VOID) RegistryQueryDwordValue(Key,
+ "AllowPdoEject",
+ &Value);
+
+ RegistryCloseKey(Key);
+
+done:
+ Pdo->Ejectable = (Value != 0) ? TRUE : FALSE;
+}
+
+static FORCEINLINE BOOLEAN
+__PdoIsEjectable(
+ IN PXENBUS_PDO Pdo
+ )
+{
+ return Pdo->Ejectable;
+}
+
#define MAXTEXTLEN 1024
static FORCEINLINE PXENBUS_FDO
Capabilities->DeviceD1 = 0;
Capabilities->DeviceD2 = 0;
Capabilities->LockSupported = 0;
- Capabilities->EjectSupported = 0;
Capabilities->DockDevice = 0;
Capabilities->UniqueID = 1;
Capabilities->SilentInstall = 1;
Capabilities->Removable = __PdoIsRemovable(Pdo) ? 1 : 0;
Capabilities->SurpriseRemovalOK = Capabilities->Removable;
+ Capabilities->EjectSupported = __PdoIsEjectable(Pdo) ? 1 : 0;
Capabilities->Address = 0xffffffff;
Capabilities->UINumber = 0xffffffff;
__PdoSetName(Pdo, Name);
__PdoSetRemovable(Pdo);
+ __PdoSetEjectable(Pdo);
status = PdoSetRevisions(Pdo);
if (!NT_SUCCESS(status))
Pdo->Revision = NULL;
Pdo->Count = 0;
+ Pdo->Ejectable = FALSE;
Pdo->Removable = FALSE;
ThreadAlert(Pdo->DevicePowerThread);