⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmisample.c

📁 WMI implementation in a iSCSI miniport can be tested using the iscsicli.exe application, device ma
💻 C
📖 第 1 页 / 共 5 页
字号:
                        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 + -