Windows NT 4.0 source code leak
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.

340 lines
7.1 KiB

4 years ago
  1. //--------------------------------------------------------------------------;
  2. //
  3. // File: DSAccess.c
  4. //
  5. // Copyright (c) 1995 Microsoft Corporation. All Rights Reserved.
  6. //
  7. // Abstract:
  8. //
  9. //
  10. // Contents:
  11. //
  12. //
  13. //--------------------------------------------------------------------------;
  14. #include "dsoundpr.h"
  15. /*
  16. * Take the DSB object return the current process access count
  17. *
  18. */
  19. DWORD FNGLOBAL DSBAccessCount
  20. (
  21. LPDSBUFFER pdsb
  22. )
  23. {
  24. LPDSPROCESS pDSPID;
  25. BOOL fFound;
  26. DWORD dwPID;
  27. DWORD dwCount;
  28. DPF(3,"DSBAccesCount entered obj %X", pdsb);
  29. dwCount = 0;
  30. dwPID = HackGetCurrentProcessId();
  31. pDSPID = pdsb->plProcess;
  32. fFound = FALSE;
  33. while( (pDSPID != NULL) && !fFound ) {
  34. if( pDSPID->dwPID == dwPID ) {
  35. dwCount = pDSPID->dwProcessRefCount;
  36. fFound = TRUE;
  37. }
  38. pDSPID = pDSPID->pNext;
  39. }
  40. DPF(3,"DSBAccesCount exit %X", dwCount);
  41. return( dwCount );
  42. } // DSBAccessCount()
  43. /*
  44. * Take the DSB object and add/increment the proccess access count
  45. *
  46. */
  47. HRESULT FNGLOBAL DSBIncAccess
  48. (
  49. LPDSBUFFER pdsb
  50. )
  51. {
  52. LPDSPROCESS pDSPID;
  53. BOOL fFound;
  54. DWORD dwPID;
  55. dwPID = GetCurrentProcessId();
  56. pDSPID = pdsb->plProcess;
  57. fFound = FALSE;
  58. while( (pDSPID != NULL) && !fFound ) {
  59. if( pDSPID->dwPID == dwPID ) {
  60. pDSPID->dwProcessRefCount++;
  61. fFound = TRUE;
  62. }
  63. pDSPID = pDSPID->pNext;
  64. }
  65. if( !fFound ) {
  66. DPF(0,"Inc Buffer Process not found");
  67. // Add new process ID entry?
  68. pDSPID = (LPDSPROCESS)MemAlloc( sizeof(DSPROCESS) );
  69. if(NULL == pDSPID) {
  70. DPF(0,"Process not found - Out of memory");
  71. return DSERR_OUTOFMEMORY;
  72. }
  73. pDSPID->dwPID = GetCurrentProcessId();
  74. pDSPID->dwProcessRefCount = 1;
  75. pDSPID->pNext = pdsb->plProcess;
  76. pdsb->plProcess = pDSPID;
  77. }
  78. return( DS_OK );
  79. } // DSBIncAccess()
  80. /*
  81. * Take the DSB object and remove/Decrement the proccess access count
  82. *
  83. */
  84. HRESULT FNGLOBAL DSBDecAccess
  85. (
  86. LPDSBUFFER pdsb
  87. )
  88. {
  89. LPDSPROCESS pDSPID;
  90. LPDSPROCESS pDSPIDPrev;
  91. BOOL fFound;
  92. DWORD dwPID;
  93. dwPID = HackGetCurrentProcessId();
  94. DPF(3,"DSBDecAccess Proces %X buffer %X", dwPID, pdsb );
  95. pDSPIDPrev = NULL;
  96. pDSPID = pdsb->plProcess;
  97. fFound = FALSE;
  98. while( (pDSPID != NULL) && !fFound ) {
  99. if( pDSPID->dwPID == dwPID ) {
  100. pDSPID->dwProcessRefCount--;
  101. fFound = TRUE;
  102. if( pDSPID->dwProcessRefCount == 0 ) {
  103. if( pDSPIDPrev == NULL ) {
  104. pdsb->plProcess = pDSPID->pNext;
  105. } else {
  106. pDSPIDPrev->pNext = pDSPID->pNext;
  107. }
  108. MemFree(pDSPID);
  109. }
  110. } else {
  111. pDSPIDPrev = pDSPID;
  112. pDSPID = pDSPID->pNext;
  113. }
  114. }
  115. if( !fFound ) {
  116. DPF(0,"Process not found");
  117. return( DSERR_GENERIC );
  118. }
  119. return( DS_OK );
  120. } // DSBDecAccess()
  121. /*
  122. * Take the DSB object and try to lock a section
  123. *
  124. */
  125. BOOL FNGLOBAL DSBLockAccess
  126. (
  127. LPDSBUFFER pdsb,
  128. DWORD dwLockOffset,
  129. DWORD dwLockLength
  130. )
  131. {
  132. LPDSPROCESSLOCK pDSBProcLock;
  133. BOOL fFound;
  134. DWORD dwPID;
  135. dwPID = GetCurrentProcessId();
  136. pDSBProcLock = pdsb->plProcLock;
  137. fFound = FALSE;
  138. while( (pDSBProcLock != NULL) && !fFound ) {
  139. // For each section locked check for overlap
  140. if( (pDSBProcLock->dwLockOffset <
  141. (dwLockOffset + dwLockLength)) &&
  142. ((pDSBProcLock->dwLockOffset + pDSBProcLock->dwLockLength) >
  143. dwLockOffset) ) {
  144. // There is an overlap
  145. fFound = TRUE;
  146. }
  147. pDSBProcLock = pDSBProcLock->pNext;
  148. }
  149. // If it is not marked as locked then lock it
  150. if( !fFound ) {
  151. DPF(4,"Lock PROCESSLOCK not overlapped buff %X pos %x len %X",
  152. pdsb, dwLockOffset, dwLockLength);
  153. // Add new PROCESSLOCK ID entry
  154. pDSBProcLock = (LPDSPROCESSLOCK)MemAlloc( sizeof(DSPROCESSLOCK) );
  155. if(NULL == pDSBProcLock) {
  156. DPF(0,"PROCESSLOCK not found - Out of memory");
  157. return TRUE;
  158. }
  159. pDSBProcLock->dwPID = GetCurrentProcessId();
  160. pDSBProcLock->dwLockOffset = dwLockOffset;
  161. pDSBProcLock->dwLockLength = dwLockLength;
  162. pDSBProcLock->pNext = pdsb->plProcLock;
  163. pdsb->plProcLock = pDSBProcLock;
  164. }
  165. return( fFound );
  166. } // DSBLockAccess()
  167. /*
  168. * Take the DSB object and unlock a section
  169. *
  170. */
  171. HRESULT FNGLOBAL DSBUnlockAccess
  172. (
  173. LPDSBUFFER pdsb,
  174. DWORD dwLockOffset
  175. )
  176. {
  177. LPDSPROCESSLOCK pDSBProcLock;
  178. LPDSPROCESSLOCK pDSBProcLockPrev;
  179. BOOL fFound;
  180. DWORD dwPID;
  181. DWORD dwPIDReal;
  182. dwPID = HackGetCurrentProcessId();
  183. dwPIDReal = GetCurrentProcessId();
  184. pDSBProcLockPrev = NULL;
  185. pDSBProcLock = pdsb->plProcLock;
  186. fFound = FALSE;
  187. while( (pDSBProcLock != NULL) && !fFound ) {
  188. if( (pDSBProcLock->dwLockOffset == dwLockOffset) ) {
  189. if( (dwPID != dwPIDReal) ||
  190. (pDSBProcLock->dwPID == dwPID) ) {
  191. fFound = TRUE;
  192. if( pDSBProcLockPrev == NULL ) {
  193. pdsb->plProcLock = pDSBProcLock->pNext;
  194. } else {
  195. pDSBProcLockPrev->pNext = pDSBProcLock->pNext;
  196. }
  197. MemFree(pDSBProcLock);
  198. } else {
  199. DPF(0,"************* Unlock from non proper process ****** " );
  200. return( DSERR_GENERIC );
  201. }
  202. } else {
  203. pDSBProcLockPrev = pDSBProcLock;
  204. pDSBProcLock = pDSBProcLock->pNext;
  205. }
  206. }
  207. if( !fFound ) {
  208. DPF(0,"ProcLock not found buffer %X offset %x", pdsb, dwLockOffset);
  209. return( DSERR_GENERIC );
  210. }
  211. return( DS_OK );
  212. } // DSBUnlockAccess()
  213. /*
  214. * Release all buffers for this process for this object
  215. */
  216. HRESULT FNGLOBAL FreeLocksOnBufferForProcess
  217. (
  218. LPDSBUFFER pdsb
  219. )
  220. {
  221. DWORD dwPID;
  222. LPDSPROCESSLOCK pDSBProcLock;
  223. LPDSPROCESSLOCK pDSBProcLockPrev;
  224. LPDSPROCESSLOCK pDSBProcLockNext;
  225. dwPID = HackGetCurrentProcessId();
  226. DPF(3, "FreeLocksOnBufferForProcess obj %X process %X", pdsb, dwPID );
  227. pDSBProcLockPrev = NULL;
  228. pDSBProcLock = pdsb->plProcLock;
  229. while( (pDSBProcLock != NULL) ) {
  230. pDSBProcLockNext = pDSBProcLock->pNext;
  231. if( (pDSBProcLock->dwPID == dwPID) ) {
  232. DPF(3, "FLBFP free LOCK start %X len %X",
  233. pDSBProcLock->dwLockOffset,
  234. pDSBProcLock->dwLockLength );
  235. if( pDSBProcLockPrev == NULL ) {
  236. pdsb->plProcLock = pDSBProcLock->pNext;
  237. } else {
  238. pDSBProcLockPrev->pNext = pDSBProcLock->pNext;
  239. }
  240. MemFree(pDSBProcLock);
  241. } else {
  242. pDSBProcLockPrev = pDSBProcLock;
  243. }
  244. pDSBProcLock = pDSBProcLockNext;
  245. }
  246. return( DS_OK );
  247. } // FreeLocksOnBufferForProcess
  248. /*
  249. * Release all buffers for this process for this object
  250. */
  251. HRESULT FNGLOBAL FreeBuffersForProcess
  252. (
  253. LPDSOUNDEXTERNAL pdse
  254. )
  255. {
  256. LPDSBUFFEREXTERNAL pdsbe,pdsbeNext;
  257. DWORD dwPID;
  258. INT iCount;
  259. dwPID = HackGetCurrentProcessId();
  260. DPF(3, "FreeBuffersForProcess DS external %X obj %X process %X",
  261. pdse, pdse->pds, dwPID );
  262. if( dwPID != pdse->dwPID ) {
  263. return DS_OK;
  264. }
  265. pdsbe = pdse->pdsbe;
  266. pdsbeNext = NULL;
  267. while( pdsbe != NULL ) {
  268. DPF(5, "FreeBuff external pdsbe %X", pdsbe );
  269. pdsbeNext = pdsbe->pNext;
  270. if( pdsbe->dwPID == dwPID ) {
  271. iCount = pdsbe->uRefCount;
  272. DPF(0, "WARNING: Implicit release of buffer %X ",pdsbe );
  273. for( ;iCount;iCount-- ) {
  274. pdsbe->lpVtbl->Release((LPDIRECTSOUNDBUFFER)pdsbe);
  275. }
  276. }
  277. pdsbe = pdsbeNext;
  278. }
  279. // Primary was freed in above list...
  280. return( DS_OK );
  281. } // FreeBuffersForProcess