📄 mm.c
字号:
if (pSessionEntry != NULL) {
pSessionEntry->Header.NodeType = SMB_CONNECTION_ENGINE_NTC(SMBCEDB_OT_SESSION);
pSessionEntry->Header.State = SMBCEDB_START_CONSTRUCTION;
pSessionEntry->Session.Type = SessionType;
SmbMmInitializeSessionEntry(pSessionEntry);
pSessionEntry->Session.CredentialHandle.dwUpper = 0xffffffff;
pSessionEntry->Session.CredentialHandle.dwLower = 0xffffffff;
pSessionEntry->Session.SecurityContextHandle.dwUpper = 0xffffffff;
pSessionEntry->Session.SecurityContextHandle.dwLower = 0xffffffff;
}
return pSessionEntry;
}
VOID
SmbMmFreeSessionEntry(
PSMBCEDB_SESSION_ENTRY pSessionEntry)
{
PAGED_CODE();
SmbMmUninitializeSessionEntry(pSessionEntry);
SmbMmFreeObjectPool(&pSessionEntry->Header);
}
PVOID
SmbMmAllocateExchange(
SMB_EXCHANGE_TYPE ExchangeType,
PVOID pv)
{
KIRQL SavedIrql;
ULONG SizeInBytes;
USHORT Flags = 0;
PSMB_EXCHANGE pExchange = NULL;
PLIST_ENTRY pListEntry;
ASSERT((ExchangeType >= 0) && (ExchangeType < SENTINEL_EXCHANGE));
if (pv==NULL) {
pv = ExAllocateFromNPagedLookasideList(
&SmbMmExchangesLookasideList[ExchangeType]);
} else {
Flags |= SMBCE_EXCHANGE_NOT_FROM_POOL;
}
if (pv != NULL) {
// Initialize the object header
pExchange = (PSMB_EXCHANGE)(pv);
// Zero the memory.
RtlZeroMemory(
pExchange,
ExchangeSizeInBytes[ExchangeType]);
pExchange->NodeTypeCode = SMB_EXCHANGE_NTC(ExchangeType);
pExchange->NodeByteSize = (USHORT)ExchangeSizeInBytes[ExchangeType];
pExchange->SmbCeState = SMBCE_EXCHANGE_INITIALIZATION_START;
pExchange->SmbCeFlags = Flags;
InitializeListHead(&pExchange->ExchangeList);
switch (pExchange->Type) {
case CONSTRUCT_NETROOT_EXCHANGE:
pExchange->pDispatchVector = &ConstructNetRootExchangeDispatch;
break;
case TRANSACT_EXCHANGE :
pExchange->pDispatchVector = &TransactExchangeDispatch;
break;
case ADMIN_EXCHANGE:
pExchange->pDispatchVector = &AdminExchangeDispatch;
break;
}
// Acquire the resource lock.
KeAcquireSpinLock( &SmbMmSpinLock, &SavedIrql );
InsertTailList(
&SmbMmExchangesInUse[pExchange->Type],
&pExchange->SmbMmInUseListEntry);
pExchange->Id = SmbMmExchangeId++;
// Release the resource lock.
KeReleaseSpinLock( &SmbMmSpinLock, SavedIrql );
}
return pExchange;
}
VOID
SmbMmFreeExchange(
PSMB_EXCHANGE pExchange)
{
if (pExchange != NULL) {
SMB_EXCHANGE_TYPE ExchangeType;
KIRQL SavedIrql;
ExchangeType = pExchange->Type;
ASSERT((ExchangeType >= 0) && (ExchangeType < SENTINEL_EXCHANGE));
// Acquire the resource lock.
KeAcquireSpinLock( &SmbMmSpinLock, &SavedIrql );
RemoveEntryList(&pExchange->SmbMmInUseListEntry);
// Release the resource lock.
KeReleaseSpinLock( &SmbMmSpinLock, SavedIrql );
if (!FlagOn(pExchange->SmbCeFlags,SMBCE_EXCHANGE_NOT_FROM_POOL)) {
ExFreeToNPagedLookasideList(
&SmbMmExchangesLookasideList[ExchangeType],
pExchange);
}
}
}
PVOID
SmbMmAllocateServerTransport(
SMBCE_SERVER_TRANSPORT_TYPE ServerTransportType)
{
PSMBCE_OBJECT_HEADER pHeader;
ULONG AllocationSize;
ULONG PoolTag;
PAGED_CODE();
switch (ServerTransportType) {
case SMBCE_STT_VC:
AllocationSize = sizeof(SMBCE_SERVER_VC_TRANSPORT);
PoolTag = MRXSMB_VC_POOLTAG;
break;
default:
ASSERT(!"Valid Server Transport Type");
return NULL;
}
pHeader = (PSMBCE_OBJECT_HEADER)
RxAllocatePoolWithTag(
NonPagedPool,
AllocationSize,
PoolTag);
if (pHeader != NULL) {
PSMBCE_SERVER_TRANSPORT pServerTransport;
RtlZeroMemory(pHeader,AllocationSize);
pHeader->ObjectCategory = SMB_SERVER_TRANSPORT_CATEGORY;
pHeader->ObjectType = (UCHAR)ServerTransportType;
pHeader->SwizzleCount = 0;
pHeader->State = 0;
pHeader->Flags = 0;
pServerTransport = (PSMBCE_SERVER_TRANSPORT)pHeader;
pServerTransport->pRundownEvent = NULL;
switch (ServerTransportType) {
case SMBCE_STT_VC:
{
PSMBCE_SERVER_VC_TRANSPORT pVcTransport;
pVcTransport = (PSMBCE_SERVER_VC_TRANSPORT)pHeader;
}
break;
default:
break;
}
}
return pHeader;
}
VOID
SmbMmFreeServerTransport(
PSMBCE_SERVER_TRANSPORT pServerTransport)
{
PAGED_CODE();
ASSERT((pServerTransport->SwizzleCount == 0) &&
(pServerTransport->ObjectCategory == SMB_SERVER_TRANSPORT_CATEGORY));
RxFreePool(pServerTransport);
}
NTSTATUS SmbMmInit()
/*++
Routine Description:
This routine initialises the connection engine structures for memory management
Return Value:
STATUS_SUCCESS if successful, otherwise an informative error code.
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG ZoneSegmentSize;
PAGED_CODE();
// Initialize the resource lock for the zone allocator.
KeInitializeSpinLock( &SmbMmSpinLock );
SmbMmRequestZoneEntrySize = QuadAlign(sizeof(SMBCEDB_REQUEST_ENTRY));
// Currently the request zone size is restricted to that of a page. This can and should
// be fine tuned.
ZoneSegmentSize = PAGE_SIZE;
SmbMmRequestZoneSegmentPtr = RxAllocatePoolWithTag(
NonPagedPool,
ZoneSegmentSize,
MRXSMB_MM_POOLTAG);
if (SmbMmRequestZoneSegmentPtr != NULL) {
SMB_EXCHANGE_TYPE ExchangeType;
ExInitializeZone(
&SmbMmRequestZone,
SmbMmRequestZoneEntrySize,
SmbMmRequestZoneSegmentPtr,
ZoneSegmentSize );
// set up the sizes for allocation.
ObjectSizeInBytes[SMBCEDB_OT_SERVER] = sizeof(SMBCEDB_SERVER_ENTRY);
ObjectSizeInBytes[SMBCEDB_OT_NETROOT] = sizeof(SMBCEDB_NET_ROOT_ENTRY);
ObjectSizeInBytes[SMBCEDB_OT_SESSION] = sizeof(SMBCEDB_SESSION_ENTRY);
ObjectSizeInBytes[SMBCEDB_OT_REQUEST] = sizeof(SMBCEDB_REQUEST_ENTRY);
ExchangeSizeInBytes[CONSTRUCT_NETROOT_EXCHANGE] = sizeof(SMB_CONSTRUCT_NETROOT_EXCHANGE);
ExchangeSizeInBytes[TRANSACT_EXCHANGE] = sizeof(SMB_TRANSACT_EXCHANGE);
ExchangeSizeInBytes[ORDINARY_EXCHANGE] = sizeof(SMB_PSE_ORDINARY_EXCHANGE);
ExchangeSizeInBytes[ADMIN_EXCHANGE] = sizeof(SMB_ADMIN_EXCHANGE);
InitializeListHead(&SmbMmExchangesInUse[CONSTRUCT_NETROOT_EXCHANGE]);
ExInitializeNPagedLookasideList(
&SmbMmExchangesLookasideList[CONSTRUCT_NETROOT_EXCHANGE],
ExAllocatePoolWithTag,
ExFreePool,
0,
sizeof(SMB_CONSTRUCT_NETROOT_EXCHANGE),
MRXSMB_MM_POOLTAG,
1);
InitializeListHead(&SmbMmExchangesInUse[TRANSACT_EXCHANGE]);
ExInitializeNPagedLookasideList(
&SmbMmExchangesLookasideList[TRANSACT_EXCHANGE],
ExAllocatePoolWithTag,
ExFreePool,
0,
sizeof(SMB_TRANSACT_EXCHANGE),
MRXSMB_MM_POOLTAG,
2);
InitializeListHead(&SmbMmExchangesInUse[ORDINARY_EXCHANGE]);
ExInitializeNPagedLookasideList(
&SmbMmExchangesLookasideList[ORDINARY_EXCHANGE],
ExAllocatePoolWithTag,
ExFreePool,
0,
sizeof(SMB_PSE_ORDINARY_EXCHANGE),
MRXSMB_MM_POOLTAG,
4);
InitializeListHead(&SmbMmExchangesInUse[ADMIN_EXCHANGE]);
ExInitializeNPagedLookasideList(
&SmbMmExchangesLookasideList[ADMIN_EXCHANGE],
ExAllocatePoolWithTag,
ExFreePool,
0,
sizeof(SMB_ADMIN_EXCHANGE),
MRXSMB_MM_POOLTAG,
1);
InitializeListHead(&SmbMmObjectsInUse[SMBCEDB_OT_SERVER]);
InitializeListHead(&SmbMmObjectsInUse[SMBCEDB_OT_SESSION]);
InitializeListHead(&SmbMmObjectsInUse[SMBCEDB_OT_NETROOT]);
InitializeListHead(&SmbMmObjectsInUse[SMBCEDB_OT_REQUEST]);
SmbMmExchangeId = 1;
} else {
Status = STATUS_INSUFFICIENT_RESOURCES;
}
return Status;
}
VOID SmbMmTearDown()
/*++
Routine Description:
This routine tears down the memory management structures in the SMB connection
engine
--*/
{
NTSTATUS Status;
PAGED_CODE();
// free the segment associated with RxCe object allocation.
RxFreePool(SmbMmRequestZoneSegmentPtr);
ExDeleteNPagedLookasideList(
&SmbMmExchangesLookasideList[CONSTRUCT_NETROOT_EXCHANGE]);
ExDeleteNPagedLookasideList(
&SmbMmExchangesLookasideList[TRANSACT_EXCHANGE]);
ExDeleteNPagedLookasideList(
&SmbMmExchangesLookasideList[ORDINARY_EXCHANGE]);
ExDeleteNPagedLookasideList(
&SmbMmExchangesLookasideList[ADMIN_EXCHANGE]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -