📄 wmisample.c
字号:
connectionInx++;
}
}
if (found == TRUE) {
break;
}
sessionInx++;
}
}
}
iSpReleaseConnectionReferences(connectionList,
numberOfSessions);
return srbStatus;
}
UCHAR
iSpBuildSessionStatistics(
IN PISCSI_ADAPTER_EXTENSION AdapterExtension,
IN PSCSIWMI_REQUEST_CONTEXT DispatchContext,
IN ULONG GuidIndex,
IN ULONG InstanceIndex,
IN ULONG InstanceCount,
IN OUT PULONG InstanceLengthArray,
IN ULONG BufferAvail,
OUT PUCHAR Buffer,
OUT PULONG SizeNeeded
)
{
PWCHAR NameOffset;
PUCHAR currentDataPos;
WMIString DynamicInstanceName;
ULONG connectionCount=0;
ULONG instanceInx;
ULONG newOutBufferAvil;
ULONG initiatorIndx;
ULONG instanceSize=0;
WMIString WMIformatString;
UCHAR srbStatus;
PWMI_CONNECTION_LIST connectionList;
ULONG numberOfSessions;
ULONG numberOfConnections;
srbStatus = SRB_STATUS_SUCCESS;
*SizeNeeded = 0;
connectionList = iSpGetConnectionList(AdapterExtension,
&numberOfSessions,
&numberOfConnections);
if (connectionList == NULL) {
DebugPrint((iScsiPrtDebugError,
"Failed to allocate array for connections\n"));
return SRB_STATUS_ERROR;
}
DebugPrint((iScsiPrtDebugInfo,
"Number of Sessions %d, Number of Connections %d\n",
numberOfSessions, numberOfConnections));
if (DispatchContext->MinorFunction == IRP_MN_QUERY_ALL_DATA)
{
ULONG sessionInx;
BOOLEAN dynamicNameStatus;
//
// instance counts
//
dynamicNameStatus = ScsiPortWmiSetInstanceCount(DispatchContext,
numberOfSessions,
&newOutBufferAvil,
SizeNeeded);
if (!dynamicNameStatus)
{
DebugPrint((iScsiPrtDebugError,
"iscsiprt: wnode is not for a dynamic instance named GUID\n"));
*SizeNeeded = 0;
srbStatus = SRB_STATUS_ERROR;
} else {
if (numberOfSessions == 0)
{
//
// no instances avaliable
//
} else {
if (newOutBufferAvil == 0)
{
//
// The buffer passed to return the data is too small
//
srbStatus = SRB_STATUS_DATA_OVERRUN;
}
//
// for the data itself
//
instanceInx = 0;
sessionInx = 0;
while (sessionInx < numberOfSessions) {
PISCSI_SESSION iScsiSession;
PISCSI_CONNECTION iScsiConnection;
if (connectionList[sessionInx].Count > 0) {
iScsiConnection = connectionList[sessionInx].ISCSIConnection[0];
iScsiSession = iScsiConnection->ISCSISession;
currentDataPos = (PUCHAR) ScsiPortWmiSetData(DispatchContext,
instanceInx,
sizeof(MSiSCSI_SessionStatistics),
&newOutBufferAvil,
SizeNeeded);
if (newOutBufferAvil == 0)
{
//
// The buffer passed to return the data is too small
//
srbStatus = SRB_STATUS_DATA_OVERRUN;
}
if ((srbStatus != SRB_STATUS_DATA_OVERRUN) &&
(currentDataPos != NULL))
{
srbStatus = iSpReadSessionStatistics(AdapterExtension,
iScsiSession,
&connectionList[sessionInx],
currentDataPos);
}
if (srbStatus == SRB_STATUS_ERROR)
{
break;
}
RtlZeroMemory(&DynamicInstanceName,
sizeof(DynamicInstanceName));
srbStatus = iSpGetDynamicSessionInstanceName(iScsiSession,
&DynamicInstanceName);
NameOffset = ScsiPortWmiSetInstanceName(DispatchContext,
instanceInx,
DynamicInstanceName.Length+sizeof(USHORT),
&newOutBufferAvil,
SizeNeeded);
if ((newOutBufferAvil == 0) && (NameOffset == NULL))
{
//
// The buffer passed to return the data is too small
//
srbStatus = SRB_STATUS_DATA_OVERRUN;
}
if (srbStatus != SRB_STATUS_DATA_OVERRUN) {
//
// copy the instance anme into NameOffset
//
RtlCopyMemory(NameOffset,
(PUCHAR)(&DynamicInstanceName),
(DynamicInstanceName.Length + sizeof(USHORT)));
}
instanceInx++;
}
sessionInx++;
}
}
}
} else { //single instance
PWCHAR instanceName;
ULONG givenInstanceNameLength = 0;
ULONG instanceNameLength;
ULONG sessionInx;
BOOLEAN found = FALSE;
//
// get the instance name
//
instanceName = ScsiPortWmiGetInstanceName(DispatchContext);
if (instanceName != NULL) {
givenInstanceNameLength = ((USHORT) *instanceName) / sizeof(WCHAR);
}
*SizeNeeded = sizeof(MSiSCSI_SessionStatistics);
if (BufferAvail < *SizeNeeded)
{
//
// The buffer passed to return the data is too small
//
srbStatus = SRB_STATUS_DATA_OVERRUN;
} else {
sessionInx = 0;
while (sessionInx < numberOfSessions) {
PISCSI_SESSION iScsiSession;
PISCSI_CONNECTION iScsiConnection;
if (connectionList[sessionInx].Count > 0) {
iScsiConnection = connectionList[sessionInx].ISCSIConnection[0];
iScsiSession = iScsiConnection->ISCSISession;
RtlZeroMemory(&DynamicInstanceName, sizeof(DynamicInstanceName));
srbStatus = iSpGetDynamicSessionInstanceName(iScsiSession,
&DynamicInstanceName);
if ((srbStatus == SRB_STATUS_ERROR) ||
(instanceName == NULL))
{
break;
}
if (!wcsncmp((PWCHAR)(&DynamicInstanceName),
instanceName,
(DynamicInstanceName.Length/sizeof(WCHAR)+1))) {
srbStatus = iSpReadSessionStatistics(AdapterExtension,
iScsiSession,
&connectionList[sessionInx],
Buffer);
if (srbStatus == SRB_STATUS_ERROR)
{
*SizeNeeded = 0;
} else {
*InstanceLengthArray = *SizeNeeded;
}
break;
}
}
sessionInx++;
}
}
}
return srbStatus;
}
UCHAR
iSpBuildRequestTimeStatistics(
IN PISCSI_ADAPTER_EXTENSION AdapterExtension,
IN PSCSIWMI_REQUEST_CONTEXT DispatchContext,
IN ULONG GuidIndex,
IN ULONG InstanceIndex,
IN ULONG InstanceCount,
IN OUT PULONG InstanceLengthArray,
IN ULONG BufferAvail,
OUT PUCHAR Buffer,
OUT PULONG SizeNeeded
)
{
PWMI_CONNECTION_LIST connectionList;
PISCSI_CONNECTION iScsiConnection;
PWCHAR NameOffset;
PUCHAR currentDataPos;
ULONG instanceInx;
ULONG newOutBufferAvil;
WMIString DynamicInstanceName;
ULONG numberOfSessions;
ULONG numberOfConnections;
UCHAR srbStatus;
srbStatus = SRB_STATUS_SUCCESS;
*SizeNeeded = 0;
connectionList = iSpGetConnectionList(AdapterExtension,
&numberOfSessions,
&numberOfConnections);
if (connectionList == NULL) {
DebugPrint((iScsiPrtDebugError,
"Failed to allocate array for connections\n"));
return SRB_STATUS_ERROR;
}
DebugPrint((iScsiPrtDebugInfo,
"Number of Sessions %d, Number of Connections %d\n",
numberOfSessions, numberOfConnections));
if (DispatchContext->MinorFunction == IRP_MN_QUERY_ALL_DATA) {
ULONG sessionInx;
ULONG connectionInx;
ULONG connectionCount;
BOOLEAN dynamicNameStatus;
dynamicNameStatus = ScsiPortWmiSetInstanceCount(DispatchContext,
numberOfConnections,
&newOutBufferAvil,
SizeNeeded);
if (!dynamicNameStatus)
{
DebugPrint((iScsiPrtDebugError,
"iscsiprt: wnode is not for a dynamic instance named GUID\n"));
*SizeNeeded = 0;
srbStatus = SRB_STATUS_ERROR;
} else {
if (newOutBufferAvil == 0) {
//
// The buffer passed to return the data is too small
//
srbStatus = SRB_STATUS_DATA_OVERRUN;
}
//
// For the data itself
//
instanceInx = 0;
sessionInx = 0;
while (sessionInx < numberOfSessions) {
connectionCount = connectionList[sessionInx].Count;
connectionInx = 0;
while (connectionInx < connectionCount) {
iScsiConnection = connectionList[sessionInx].ISCSIConnection[connectionInx];
if (iScsiConnection != NULL) {
currentDataPos = (PUCHAR) ScsiPortWmiSetData(DispatchContext,
instanceInx,
sizeof(MSiSCSI_ConnectionStatistics),
&newOutBufferAvil,
SizeNeeded);
if (newOutBufferAvil == 0)
{
//
// The buffer passed to return the data is too small
//
srbStatus = SRB_STATUS_DATA_OVERRUN;
}
if ((srbStatus != SRB_STATUS_DATA_OVERRUN) &&
(currentDataPos != NULL)) {
srbStatus = iSpReadRequestTimeStatistics(AdapterExtension,
iScsiConnection,
currentDataPos);
if (srbStatus == SRB_STATUS_ERROR)
{
break;
}
}
RtlZeroMemory(&DynamicInstanceName,
sizeof(DynamicInstanceName));
srbStatus = iSpGetDynamicConnectionInstanceName(
iScsiConnection,
&DynamicInstanceName);
if (srbStatus == SRB_STATUS_ERROR)
{
break;
}
NameOffset = ScsiPortWmiSetInstanceName(
DispatchContext,
instanceInx,
DynamicInstanceName.Length+sizeof(USHORT),
&newOutBufferAvil,
SizeNeeded);
if ((newOutBufferAvil == 0) && (NameOffset == NULL))
{
//
// The buffer passed to return the data is too small
//
srbStatus = SRB_STATUS_DATA_OVERRUN;
}
if (srbStatus != SRB_STATUS_DATA_OVERRUN)
{
//
// copy the instance anme into NameOffset
//
RtlCopyMemory(NameOffset, (PUCHAR)(&DynamicInstanceName),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -