Temporary code for debugging purposes
[reactos.git] / posix / lib / psxdll / misc / main.c
index 37e4493..04b8db2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: main.c,v 1.3 2002/03/11 20:48:25 hyperion Exp $
+/* $Id: main.c,v 1.4 2002/05/17 02:04:39 hyperion Exp $
  */
 /*
  * COPYRIGHT:   See COPYING in the top level directory
  */
 /*
  * COPYRIGHT:   See COPYING in the top level directory
  *              27/12/2001: Created
  */
 
  *              27/12/2001: Created
  */
 
+#include <ddk/ntddk.h>
+#include <string.h>
 #include <psx/debug.h>
 #include <psx/debug.h>
+#include <psx/fdtable.h>
 #include <psx/pdata.h>
 #include <psx/pdata.h>
+#include <psx/stdlib.h>
+#include <psx/tls.h>
 
 
-#define DLL_PROCESS_ATTACH 1    
-#define DLL_THREAD_ATTACH  2    
-#define DLL_THREAD_DETACH  3    
-#define DLL_PROCESS_DETACH 0    
+#define DLL_PROCESS_ATTACH 1
+#define DLL_THREAD_ATTACH  2
+#define DLL_THREAD_DETACH  3
+#define DLL_PROCESS_DETACH 0
 
 
-int __stdcall DllMain(void *pDllInstance, unsigned long int nReason, void *pUnknown)
+/* WARNING: PRELIMINARY CODE FOR DEBUGGING PURPOSES ONLY - DO NOT CHANGE */
+static __PDX_PDATA __PdxPdata;
+static WCHAR __tempPathBuf[32768];
+static char * __tempSelf = "-sh";
+static char * __tempArgv[2] = {0, 0};
+
+VOID __PdxSetProcessData(__PPDX_PDATA NewPdata)
+{
+ memcpy(&__PdxPdata, NewPdata, sizeof(__PdxPdata));
+}
+
+__PPDX_PDATA __PdxGetProcessData(VOID)
+{
+ return &__PdxPdata;
+}
+
+BOOL STDCALL DllMain(PVOID pDllInstance, DWORD nReason, PVOID pUnknown)
 {
 {
-#if 0
- if(nReason == DLL_PROCESS_ATTACH)
+ ULONG nJunk;
+
+ switch(nReason)
  {
  {
-  __PPDX_PDATA ppdProcessData = __PdxGetProcessData();
+  /* 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);
+  }
 
 
-  if(ppdProcessData == 0)
-   WARN("this process doesn't have a process data block\n");
-  else if(ppdProcessData->Spawned)
+  /* thread exited */
+  case DLL_THREAD_DETACH:
   {
   {
-   INFO("the process has been spawned\n");
+   INFO("thread about to exit");
+   
+   INFO("about to deallocate thread data");
+   __free(NtCurrentTeb()->TlsSlots[__PdxPdata.TlsIndex]);
+   
+   return (TRUE);
   }
  }
   }
  }
-#endif
- return (1);
+ return (FALSE);
 }
 
 /* EOF */
 }
 
 /* EOF */