mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
2.4 KiB
143 lines
2.4 KiB
/*++
|
|
|
|
Copyright (c) 1995-1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Mid.cxx
|
|
|
|
Abstract:
|
|
|
|
Implements the CMid class.
|
|
|
|
Author:
|
|
|
|
Mario Goertzel [MarioGo]
|
|
|
|
Revision History:
|
|
|
|
MarioGo 12-13-95 Bits 'n pieces
|
|
MarioGo 02-01-96 Move binding handles out of mid
|
|
|
|
--*/
|
|
|
|
#include<or.hxx>
|
|
|
|
CRITICAL_SECTION gcsMidLock;
|
|
|
|
|
|
RPC_BINDING_HANDLE
|
|
CMid::GetBinding(
|
|
OUT USHORT &index
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Gets an RPC binding handle to the remote machine.
|
|
|
|
Arguments:
|
|
|
|
index - index into the string array contianed within
|
|
this MID structure which can be passed to BindingFailed().
|
|
Maybe modified even on failure.
|
|
|
|
Return Value:
|
|
|
|
0 - when no more binding are available.
|
|
|
|
non-zero - A binding to the machine.
|
|
|
|
--*/
|
|
{
|
|
PWSTR pwstrT;
|
|
RPC_BINDING_HANDLE hserver;
|
|
|
|
if (IsLocal())
|
|
{
|
|
return(0);
|
|
}
|
|
|
|
CMutexLock lock(&gcsMidLock);
|
|
|
|
// Loop until we get a binding handle or run out of string bindings.
|
|
for (;;)
|
|
{
|
|
pwstrT = &_dsa.aStringArray[_iStringBinding];
|
|
if (*pwstrT == 0)
|
|
{
|
|
// Reached the end of the string bindings; give up..
|
|
_iStringBinding = 0;
|
|
return(0);
|
|
}
|
|
|
|
index = pwstrT - _dsa.aStringArray;
|
|
|
|
lock.Unlock();
|
|
|
|
if (_fDynamic)
|
|
{
|
|
// Create binding without an endpoint.
|
|
hserver = ::GetBinding(pwstrT);
|
|
}
|
|
else
|
|
{
|
|
hserver = GetBindingToOr(pwstrT);
|
|
}
|
|
|
|
if (hserver != 0)
|
|
{
|
|
// index is already correct.
|
|
return(hserver);
|
|
}
|
|
|
|
lock.Lock();
|
|
BindingFailed(index);
|
|
}
|
|
|
|
ASSERT(0);
|
|
}
|
|
|
|
void
|
|
CMid::BindingFailed(
|
|
IN USHORT Index
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
What a call on a binding handle associated with an index
|
|
returned from GetBinding() fails this routine must be
|
|
call before the next call to GetBinding() to update
|
|
the internal state.
|
|
|
|
Arguments:
|
|
|
|
Index - An index updated by a previous call to GetBinding().
|
|
|
|
|
|
Notes:
|
|
|
|
Maybe called with the gcsMidLock already held.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
USHORT newIndex;
|
|
PWSTR pwstrT = &_dsa.aStringArray[Index];
|
|
|
|
pwstrT = OrStringSearch(pwstrT, 0) + 1;
|
|
|
|
newIndex = pwstrT - _dsa.aStringArray;
|
|
|
|
CMutexLock lock(&gcsMidLock);
|
|
|
|
if (newIndex > _iStringBinding)
|
|
{
|
|
_iStringBinding = newIndex;
|
|
}
|
|
}
|
|
|