Annotation of ntddk/src/network/tdi/devctx.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1989-1993  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     devctx.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This module contains code which implements the DEVICE_CONTEXT object.
        !            12:     Routines are provided to reference, and dereference transport device
        !            13:     context objects.
        !            14: 
        !            15:     The transport device context object is a structure which contains a
        !            16:     system-defined DEVICE_OBJECT followed by information which is maintained
        !            17:     by the transport provider, called the context.
        !            18: 
        !            19: Environment:
        !            20: 
        !            21:     Kernel mode
        !            22: 
        !            23: Revision History:
        !            24: 
        !            25: --*/
        !            26: 
        !            27: #include "st.h"
        !            28: 
        !            29: 
        !            30: VOID
        !            31: StRefDeviceContext(
        !            32:     IN PDEVICE_CONTEXT DeviceContext
        !            33:     )
        !            34: 
        !            35: /*++
        !            36: 
        !            37: Routine Description:
        !            38: 
        !            39:     This routine increments the reference count on a device context.
        !            40: 
        !            41: Arguments:
        !            42: 
        !            43:     DeviceContext - Pointer to a transport device context object.
        !            44: 
        !            45: Return Value:
        !            46: 
        !            47:     none.
        !            48: 
        !            49: --*/
        !            50: 
        !            51: {
        !            52:     ASSERT (DeviceContext->ReferenceCount > 0);    // not perfect, but...
        !            53: 
        !            54:     (VOID)ExInterlockedIncrementLong (
        !            55:               &DeviceContext->ReferenceCount,
        !            56:               &DeviceContext->Interlock);
        !            57: 
        !            58: } /* StRefDeviceContext */
        !            59: 
        !            60: 
        !            61: VOID
        !            62: StDerefDeviceContext(
        !            63:     IN PDEVICE_CONTEXT DeviceContext
        !            64:     )
        !            65: 
        !            66: /*++
        !            67: 
        !            68: Routine Description:
        !            69: 
        !            70:     This routine dereferences a device context by decrementing the
        !            71:     reference count contained in the structure.  Currently, we don't
        !            72:     do anything special when the reference count drops to zero, but
        !            73:     we could dynamically unload stuff then.
        !            74: 
        !            75: Arguments:
        !            76: 
        !            77:     DeviceContext - Pointer to a transport device context object.
        !            78: 
        !            79: Return Value:
        !            80: 
        !            81:     none.
        !            82: 
        !            83: --*/
        !            84: 
        !            85: {
        !            86:     INTERLOCKED_RESULT result;
        !            87: 
        !            88:     result = ExInterlockedDecrementLong (
        !            89:                  &DeviceContext->ReferenceCount,
        !            90:                  &DeviceContext->Interlock);
        !            91: 
        !            92:     ASSERT (result != ResultNegative);
        !            93: 
        !            94:     if (result == ResultZero) {
        !            95:         StDestroyDeviceContext (DeviceContext);
        !            96:     }
        !            97: 
        !            98: } /* StDerefDeviceContext */
        !            99: 
        !           100: 
        !           101: 
        !           102: NTSTATUS
        !           103: StCreateDeviceContext(
        !           104:     IN PDRIVER_OBJECT DriverObject,
        !           105:     IN PUNICODE_STRING DeviceName,
        !           106:     IN OUT PDEVICE_CONTEXT *DeviceContext
        !           107:     )
        !           108: 
        !           109: /*++
        !           110: 
        !           111: Routine Description:
        !           112: 
        !           113:     This routine creates and initializes a device context structure.
        !           114: 
        !           115: Arguments:
        !           116: 
        !           117: 
        !           118:     DriverObject - pointer to the IO subsystem supplied driver object.
        !           119: 
        !           120:     DeviceContext - Pointer to a pointer to a transport device context object.
        !           121: 
        !           122:     DeviceName - pointer to the name of the device this device object points to.
        !           123: 
        !           124: Return Value:
        !           125: 
        !           126:     STATUS_SUCCESS if all is well; STATUS_INSUFFICIENT_RESOURCES otherwise.
        !           127: 
        !           128: --*/
        !           129: 
        !           130: {
        !           131:     NTSTATUS status;
        !           132:     PDEVICE_OBJECT deviceObject;
        !           133:     PDEVICE_CONTEXT deviceContext;
        !           134:     USHORT i;
        !           135: 
        !           136: 
        !           137:     //
        !           138:     // Create the device object for the sample transport, allowing
        !           139:     // room at the end for the device name to be stored (for use
        !           140:     // in logging errors).
        !           141:     //
        !           142: 
        !           143:     status = IoCreateDevice(
        !           144:                  DriverObject,
        !           145:                  sizeof (DEVICE_CONTEXT) - sizeof (DEVICE_OBJECT) +
        !           146:                      (DeviceName->Length + sizeof(UNICODE_NULL)),
        !           147:                  DeviceName,
        !           148:                  FILE_DEVICE_TRANSPORT,
        !           149:                  0,
        !           150:                  FALSE,
        !           151:                  &deviceObject);
        !           152: 
        !           153:     if (!NT_SUCCESS(status)) {
        !           154:         return status;
        !           155:     }
        !           156: 
        !           157:     deviceObject->Flags |= DO_DIRECT_IO;
        !           158: 
        !           159:     deviceContext = (PDEVICE_CONTEXT)deviceObject;
        !           160: 
        !           161:     //
        !           162:     // Initialize our part of the device context.
        !           163:     //
        !           164: 
        !           165:     RtlZeroMemory(
        !           166:         ((PUCHAR)deviceContext) + sizeof(DEVICE_OBJECT),
        !           167:         sizeof(DEVICE_CONTEXT) - sizeof(DEVICE_OBJECT));
        !           168: 
        !           169:     //
        !           170:     // Copy over the device name.
        !           171:     //
        !           172: 
        !           173:     deviceContext->DeviceNameLength = DeviceName->Length + sizeof(WCHAR);
        !           174:     deviceContext->DeviceName = (PWCHAR)(deviceContext+1);
        !           175:     RtlCopyMemory(
        !           176:         deviceContext->DeviceName,
        !           177:         DeviceName->Buffer,
        !           178:         DeviceName->Length);
        !           179:     deviceContext->DeviceName[DeviceName->Length/sizeof(WCHAR)] = UNICODE_NULL;
        !           180: 
        !           181:     //
        !           182:     // Initialize the reference count.
        !           183:     //
        !           184: 
        !           185:     deviceContext->ReferenceCount = 1;
        !           186: 
        !           187:     //
        !           188:     // initialize the various fields in the device context
        !           189:     //
        !           190: 
        !           191:     KeInitializeSpinLock (&deviceContext->Interlock);
        !           192:     KeInitializeSpinLock (&deviceContext->SpinLock);
        !           193:     KeInitializeSpinLock (&deviceContext->StatisticsInterlock);
        !           194:     KeInitializeSpinLock (&deviceContext->StatisticsSpinLock);
        !           195: 
        !           196:     deviceContext->ControlChannelIdentifier = 1;
        !           197: 
        !           198:     InitializeListHead (&deviceContext->ConnectionPool);
        !           199:     InitializeListHead (&deviceContext->AddressPool);
        !           200:     InitializeListHead (&deviceContext->AddressFilePool);
        !           201:     InitializeListHead (&deviceContext->AddressDatabase);
        !           202:     InitializeListHead (&deviceContext->PacketWaitQueue);
        !           203:     InitializeListHead (&deviceContext->PacketizeQueue);
        !           204:     InitializeListHead (&deviceContext->RequestPool);
        !           205:     deviceContext->PacketPool.Next = NULL;
        !           206:     deviceContext->ReceivePacketPool.Next = NULL;
        !           207:     deviceContext->ReceiveBufferPool.Next = NULL;
        !           208:     InitializeListHead (&deviceContext->ReceiveInProgress);
        !           209:     InitializeListHead (&deviceContext->IrpCompletionQueue);
        !           210: 
        !           211: 
        !           212:     deviceContext->State = DEVICECONTEXT_STATE_CLOSED;
        !           213: 
        !           214:     //
        !           215:     // Initialize the resource that guards address ACLs.
        !           216:     //
        !           217: 
        !           218:     ExInitializeResource (&deviceContext->AddressResource);
        !           219: 
        !           220:     //
        !           221:     // set the netbios multicast address for this network type
        !           222:     //
        !           223: 
        !           224:     for (i=0; i<HARDWARE_ADDRESS_LENGTH; i++) {
        !           225:         deviceContext->LocalAddress.Address [i] = 0; // set later
        !           226:         deviceContext->MulticastAddress.Address [i] = 0;
        !           227:     }
        !           228: 
        !           229:      deviceContext->Type = ST_DEVICE_CONTEXT_SIGNATURE;
        !           230:      deviceContext->Size - sizeof (DEVICE_CONTEXT);
        !           231: 
        !           232:     *DeviceContext = deviceContext;
        !           233:     return STATUS_SUCCESS;
        !           234: }
        !           235: 
        !           236: 
        !           237: VOID
        !           238: StDestroyDeviceContext(
        !           239:     IN PDEVICE_CONTEXT DeviceContext
        !           240:     )
        !           241: 
        !           242: /*++
        !           243: 
        !           244: Routine Description:
        !           245: 
        !           246:     This routine destroys a device context structure.
        !           247: 
        !           248: Arguments:
        !           249: 
        !           250:     DeviceContext - Pointer to a pointer to a transport device context object.
        !           251: 
        !           252: Return Value:
        !           253: 
        !           254:     None.
        !           255: 
        !           256: --*/
        !           257: 
        !           258: {
        !           259:     ExDeleteResource (&DeviceContext->AddressResource);
        !           260:     IoDeleteDevice ((PDEVICE_OBJECT)DeviceContext);
        !           261:     return;
        !           262: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.