2 * PROJECT: ReactOS Service Host
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: base/services/svchost/netbios.c
5 * PURPOSE: NetBIOS Service Support
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES ******************************************************************/
16 /* GLOBALS *******************************************************************/
18 LONG GlobalNetBiosUseCount
;
20 CRITICAL_SECTION SvcNetBiosCritSec
;
22 /* FUNCTIONS *****************************************************************/
26 SvcNetBiosStatusToApiStatus (
27 _In_ DWORD NetBiosError
30 /* Convert from one status to another */
37 return NERR_DuplicateName
;
40 return ERROR_INVALID_PARAMETER
;
42 return NERR_NameNotFound
;
44 return NERR_NoNetworkResource
;
46 return NERR_AlreadyExists
;
48 return NERR_TooManyNames
;
50 return NERR_DeleteLater
;
52 return ERROR_REM_NOT_LIST
;
54 return NERR_NetworkError
;
66 /* Clear the flag for this LANA */
67 return (i
<= 7) ? LanaFlags
[i
] & (1 << (Lana
- 32 * i
)) : FALSE
;
78 /* Set the flag for this LANA */
79 if (i
<= 7) LanaFlags
[i
] |= 1 << (Lana
- 32 * i
);
88 /* Initialize NetBIOS-related structures and variables */
89 InitializeCriticalSection(&SvcNetBiosCritSec
);
90 GlobalNetBiosUseCount
= 0;
91 ZeroMemory(LanaFlags
, sizeof(LanaFlags
));
100 /* While holding the lock, drop a reference*/
101 EnterCriticalSection(&SvcNetBiosCritSec
);
102 if ((GlobalNetBiosUseCount
!= 0) && (--GlobalNetBiosUseCount
== 0))
104 /* All references are gone, clear all LANA's */
105 ZeroMemory(LanaFlags
, sizeof(LanaFlags
));
107 LeaveCriticalSection(&SvcNetBiosCritSec
);
116 /* Increment the reference counter while holding the lock */
117 EnterCriticalSection(&SvcNetBiosCritSec
);
118 GlobalNetBiosUseCount
++;
119 LeaveCriticalSection(&SvcNetBiosCritSec
);
128 DWORD dwError
= ERROR_SUCCESS
;
132 /* Block all other NetBIOS operations */
133 EnterCriticalSection(&SvcNetBiosCritSec
);
135 /* Is this LANA enabled? */
136 if (!LanaFlagIsSet(LanaNum
))
138 /* Yep, build a reset packet */
139 ZeroMemory(&ncb
, sizeof(ncb
));
141 ncb
.ncb_command
= NCBRESET
;
142 ncb
.ncb_callname
[0] = 0xFE; // Max Sessions
143 ncb
.ncb_callname
[1] = 0;
144 ncb
.ncb_callname
[2] = 0xFD; // Max Names
145 ncb
.ncb_callname
[3] = 0;
146 ncb
.ncb_lana_num
= LanaNum
;
149 nbtError
= Netbios(&ncb
);
151 /* Convert the status to Win32 format */
152 dwError
= SvcNetBiosStatusToApiStatus(nbtError
);
154 /* Enable the LANA if the reset worked */
155 if (dwError
== ERROR_SUCCESS
) SetLanaFlag(LanaNum
);
158 /* Drop the lock and return */
159 LeaveCriticalSection(&SvcNetBiosCritSec
);