+ /* process created, first thread created */
+ case DLL_PROCESS_ATTACH:
+ {
+ __PPDX_TDATA ThreadData;
+ int i;
+
+ INFO("new process and new thread created");
+
+ __PdxPdata.Spawned = 1;
+
+ __PdxPdata.ArgCount = 1;
+ __tempArgv[0] = __tempSelf;
+ __PdxPdata.ArgVect = __tempArgv;
+
+ __PdxPdata.NativePathBuffer.Length = 0;
+ __PdxPdata.NativePathBuffer.MaximumLength = sizeof(__tempPathBuf);
+ __PdxPdata.NativePathBuffer.Buffer = __tempPathBuf;
+
+ INFO("about to initialize process data lock");
+ RtlInitializeCriticalSection(&__PdxPdata.Lock);
+
+ INFO("about to allocate TLS slot");
+ __PdxPdata.TlsIndex = RtlFindClearBitsAndSet(NtCurrentPeb()->TlsBitmap, 1, 0);
+
+ if(__PdxPdata.TlsIndex == -1)
+ {
+ DbgBreakPoint();
+ NtRaiseHardError(STATUS_NO_MEMORY, 0, 0, 0, 1, (ULONG)&nJunk);
+ return (FALSE);
+ }
+
+ INFO("allocated TLS slot %d", __PdxPdata.TlsIndex);
+
+ INFO("about to allocate thread data");
+ ThreadData = __malloc(sizeof(*ThreadData));
+
+ if(ThreadData == 0)
+ {
+ DbgBreakPoint();
+ NtRaiseHardError(STATUS_NO_MEMORY, 0, 0, 0, 1, (ULONG)&nJunk);
+ return (FALSE);
+ }
+
+ NtCurrentTeb()->TlsSlots[__PdxPdata.TlsIndex] = ThreadData;
+
+ INFO("about to initialize file descriptors table");
+ __fdtable_init(&__PdxPdata.FdTable);
+
+ INFO("end of initialization");
+ return (TRUE);
+ }
+
+ /* process about to exit */
+ case DLL_PROCESS_DETACH:
+ {
+ INFO("process about to exit");
+
+ INFO("about to deallocate thread data");
+ __free(NtCurrentTeb()->TlsSlots[__PdxPdata.TlsIndex]);
+
+ return (TRUE);
+ }
+
+ /* thread created */
+ case DLL_THREAD_ATTACH:
+ {
+ __PPDX_TDATA ThreadData;
+
+ INFO("new thread created");
+
+ INFO("about to allocate thread data");
+ ThreadData = __malloc(sizeof(*ThreadData));
+
+ if(ThreadData == 0)
+ {
+ DbgBreakPoint();
+ NtRaiseHardError(STATUS_NO_MEMORY, 0, 0, 0, 1, (ULONG)&nJunk);
+ return (FALSE);
+ }
+
+ NtCurrentTeb()->TlsSlots[__PdxPdata.TlsIndex] = ThreadData;
+
+ return (TRUE);
+ }