// // Login with current LSS information // Assume LspReconnect is called before this call. // NTSTATUS LspRelogin( IN OUT PLANSCSI_SESSION LSS, IN BOOLEAN IsEncryptBuffer ) { NTSTATUS ntStatus; LSSLOGIN_INFO LoginInfo; LSPROTO_TYPE LSProto; ASSERT(LSS); ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); LoginInfo.LoginType = LOGIN_TYPE_NORMAL; RtlCopyMemory(&LoginInfo.UserID, &LSS->UserID, LSPROTO_USERID_LENGTH); RtlCopyMemory(&LoginInfo.Password, &LSS->Password, LSPROTO_PASSWORD_LENGTH); RtlCopyMemory((PVOID)LoginInfo.Password_v2, (PVOID)LSS->Password_v2, LSPROTO_PASSWORD_V2_LENGTH); LoginInfo.MaxBlocksPerRequest = LSS->MaxBlocksPerRequest; LoginInfo.LanscsiTargetID = LSS->LanscsiTargetID; LoginInfo.LanscsiLU = LSS->LanscsiLU; LoginInfo.HWType = LSS->HWType; LoginInfo.HWVersion = LSS->HWVersion; LoginInfo.HWRevision = LSS->HWRevision; LoginInfo.IsEncryptBuffer = IsEncryptBuffer; LoginInfo.BlockInBytes = LSS->BlockInBytes; ntStatus = LspLookupProtocol(LSS->HWType, LSS->HWVersion, &LSProto); if(!NT_SUCCESS(ntStatus)) { KDPrintM(DBG_PROTO_ERROR, ("HWVersion wrong.\n")); return STATUS_NOT_IMPLEMENTED; } ntStatus = LspLogin( LSS, &LoginInfo, LSProto, TRUE ); if(!NT_SUCCESS(ntStatus)) { LstransDisconnect(&LSS->ConnectionFile, 0); LstransDisassociate(&LSS->ConnectionFile); LstransCloseConnection(&LSS->ConnectionFile); LstransCloseAddress(&LSS->AddressFile); goto cleanup; } cleanup: return ntStatus; }
NTSTATUS LspDisconnect( IN PLANSCSI_SESSION LSS ) { NTSTATUS ntStatus; ASSERT(LSS); LstransDisconnect(&LSS->ConnectionFile, 0); LstransDisassociate(&LSS->ConnectionFile); LstransCloseConnection(&LSS->ConnectionFile); ntStatus = LstransCloseAddress(&LSS->AddressFile); LSS->LanscsiProtocol = NULL; return ntStatus; }
NTSTATUS LspReconnectAndLogin( IN OUT PLANSCSI_SESSION LSS, IN LSTRANS_TYPE LstransType ) { NTSTATUS ntStatus; LSSLOGIN_INFO LoginInfo; LSPROTO_TYPE LSProto; ASSERT(LSS); LoginInfo.LoginType = LOGIN_TYPE_NORMAL; RtlCopyMemory(&LoginInfo.UserID, &LSS->UserID, LSPROTO_USERID_LENGTH); RtlCopyMemory(&LoginInfo.Password, &LSS->Password, LSPROTO_PASSWORD_LENGTH); LoginInfo.MaxBlocksPerRequest = LSS->MaxBlocksPerRequest; LoginInfo.LanscsiTargetID = LSS->LanscsiTargetID; LoginInfo.LanscsiLU = LSS->LanscsiLU; LoginInfo.HWType = LSS->HWType; LoginInfo.HWVersion = LSS->HWVersion; ntStatus = LspLookupProtocol(LSS->HWType, LSS->HWVersion, &LSProto); if(!NT_SUCCESS(ntStatus)) { KDPrintM(DBG_PROTO_ERROR, ("HWVersion wrong.\n")); return STATUS_NOT_IMPLEMENTED; } ntStatus = LstransOpenAddress(&LSS->SourceAddress, &LSS->AddressFile); if( !NT_SUCCESS(ntStatus) ) { goto cleanup; } ntStatus = LstransOpenConnection(NULL, LstransType, &LSS->ConnectionFile); if( !NT_SUCCESS(ntStatus) ) { LstransCloseAddress(&LSS->AddressFile); goto cleanup; } ntStatus = LstransAssociate(&LSS->AddressFile, &LSS->ConnectionFile); if( !NT_SUCCESS(ntStatus) ) { LstransCloseConnection(&LSS->ConnectionFile); LstransCloseAddress(&LSS->AddressFile); goto cleanup; } ntStatus = LstransConnect(&LSS->ConnectionFile, &LSS->LSNodeAddress, &LSS->TimeOuts[0]); if( !NT_SUCCESS(ntStatus) ) { LstransDisassociate(&LSS->ConnectionFile); LstransCloseConnection(&LSS->ConnectionFile); LstransCloseAddress(&LSS->AddressFile); goto cleanup; } /* ntStatus = LstransRegisterDisconnectHandler( &LSS->AddressFile, LspDisconHandler, &LSS ); if( !NT_SUCCESS(ntStatus) ) { LstransDisassociate(&LSS->AddressFile, &LSS->ConnectionFile); LstransCloseConnection(&LSS->ConnectionFile); LstransCloseAddress(&LSS->AddressFile); goto cleanup; } */ ntStatus = LspLogin( LSS, &LoginInfo, LSProto ); if(!NT_SUCCESS(ntStatus)) { LstransDisconnect(&LSS->ConnectionFile, 0); LstransDisassociate(&LSS->ConnectionFile); LstransCloseConnection(&LSS->ConnectionFile); LstransCloseAddress(&LSS->AddressFile); goto cleanup; } cleanup: return ntStatus; }