⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dllmain.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
  else
    {
      PSINGLE_LIST_ENTRY e;
      
      DPRINT("Destroying W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql());

      Win32Thread->IsExiting = TRUE;
      HOOK_DestroyThreadHooks(Thread);
      UnregisterThreadHotKeys(Thread);
      /* what if this co_ func crash in umode? what will clean us up then? */
      co_DestroyThreadWindows(Thread);
      IntBlockInput(Win32Thread, FALSE);
      MsqDestroyMessageQueue(Win32Thread->MessageQueue);
      IntCleanupThreadCallbacks(Win32Thread);

      /* cleanup user object references stack */
      e = PopEntryList(&Win32Thread->ReferencesList);
      while (e)
      {
         PUSER_REFERENCE_ENTRY ref = CONTAINING_RECORD(e, USER_REFERENCE_ENTRY, Entry);
         DPRINT("thread clean: remove reference obj 0x%x\n",ref->obj);
         ObmDereferenceObject(ref->obj);
         
         e = PopEntryList(&Win32Thread->ReferencesList);
      }

      IntSetThreadDesktop(NULL,
                          TRUE);

      if (Win32Thread->ThreadInfo != NULL)
      {
          UserHeapFree(Win32Thread->ThreadInfo);
          Win32Thread->ThreadInfo = NULL;
      }

      PsSetThreadWin32Thread(Thread, NULL);
    }

  RETURN( STATUS_SUCCESS);
  
CLEANUP:
  UserLeave();
  DPRINT("Leave Win32kThreadCallback, ret=%i\n",_ret_);
  END_CLEANUP;
}

/* Only used in ntuser/input.c KeyboardThreadMain(). If it's
   not called there anymore, please delete */
NTSTATUS
Win32kInitWin32Thread(PETHREAD Thread)
{
  PEPROCESS Process;

  Process = Thread->ThreadsProcess;

  if (Process->Win32Process == NULL)
    {
      /* FIXME - lock the process */
      Process->Win32Process = ExAllocatePool(NonPagedPool, sizeof(W32PROCESS));

      if (Process->Win32Process == NULL)
	return STATUS_NO_MEMORY;

      RtlZeroMemory(Process->Win32Process, sizeof(W32PROCESS));
      /* FIXME - unlock the process */

      Win32kProcessCallback(Process, TRUE);
    }

  if (Thread->Tcb.Win32Thread == NULL)
    {
      Thread->Tcb.Win32Thread = ExAllocatePool (NonPagedPool, sizeof(W32THREAD));
      if (Thread->Tcb.Win32Thread == NULL)
	return STATUS_NO_MEMORY;

      RtlZeroMemory(Thread->Tcb.Win32Thread, sizeof(W32THREAD));

      Win32kThreadCallback(Thread, PsW32ThreadCalloutInitialize);
    }

  return(STATUS_SUCCESS);
}


/*
 * This definition doesn't work
 */
NTSTATUS STDCALL
DriverEntry (
  IN	PDRIVER_OBJECT	DriverObject,
  IN	PUNICODE_STRING	RegistryPath)
{
  NTSTATUS Status;
  BOOLEAN Result;
  WIN32_CALLOUTS_FPNS CalloutData = {0};
  PVOID GlobalUserHeapBase = NULL;

  /*
   * Register user mode call interface
   * (system service table index = 1)
   */
  Result = KeAddSystemServiceTable (Win32kSSDT,
				    NULL,
				    Win32kNumberOfSysCalls,
				    Win32kSSPT,
				    1);
  if (Result == FALSE)
    {
      DPRINT1("Adding system services failed!\n");
      return STATUS_UNSUCCESSFUL;
    }

    /*
     * Register Object Manager Callbacks
     */
    CalloutData.WindowStationParseProcedure = IntWinStaObjectParse;
    CalloutData.WindowStationDeleteProcedure = IntWinStaObjectDelete;
    CalloutData.DesktopDeleteProcedure = IntDesktopObjectDelete;
    CalloutData.ProcessCallout = Win32kProcessCallback;
    CalloutData.ThreadCallout = Win32kThreadCallback;
    
    /*
     * Register our per-process and per-thread structures.
     */
    PsEstablishWin32Callouts((PWIN32_CALLOUTS_FPNS)&CalloutData);

    GlobalUserHeap = UserCreateHeap(&GlobalUserHeapSection,
                                    &GlobalUserHeapBase,
                                    1 * 1024 * 1024); /* FIXME - 1 MB for now... */
    if (GlobalUserHeap == NULL)
    {
        DPRINT1("Failed to initialize the global heap!\n");
        return STATUS_UNSUCCESSFUL;
    }


  Status = InitUserImpl();
  if (!NT_SUCCESS(Status))
  {
    DPRINT1("Failed to initialize user implementation!\n");
    return STATUS_UNSUCCESSFUL;
  }

  Status = InitHotkeyImpl();
  if (!NT_SUCCESS(Status))
  {
    DPRINT1("Failed to initialize hotkey implementation!\n");
    return STATUS_UNSUCCESSFUL;
  }

  Status = InitWindowStationImpl();
  if (!NT_SUCCESS(Status))
  {
    DPRINT1("Failed to initialize window station implementation!\n");
    return STATUS_UNSUCCESSFUL;
  }

  Status = InitDesktopImpl();
  if (!NT_SUCCESS(Status))
  {
    DPRINT1("Failed to initialize desktop implementation!\n");
    return STATUS_UNSUCCESSFUL;
  }

  Status = InitWindowImpl();
  if (!NT_SUCCESS(Status))
  {
    DPRINT1("Failed to initialize window implementation!\n");
    return STATUS_UNSUCCESSFUL;
  }

  Status = InitMenuImpl();
  if (!NT_SUCCESS(Status))
  {
    DPRINT1("Failed to initialize menu implementation!\n");
    return STATUS_UNSUCCESSFUL;
  }

  Status = InitInputImpl();
  if (!NT_SUCCESS(Status))
    {
      DPRINT1("Failed to initialize input implementation.\n");
      return(Status);
    }

  Status = InitKeyboardImpl();
  if (!NT_SUCCESS(Status))
    {
      DPRINT1("Failed to initialize keyboard implementation.\n");
      return(Status);
    }

  Status = InitMonitorImpl();
  if (!NT_SUCCESS(Status))
    {
      DbgPrint("Failed to initialize monitor implementation!\n");
      return STATUS_UNSUCCESSFUL;
    }

  Status = MsqInitializeImpl();
  if (!NT_SUCCESS(Status))
    {
      DPRINT1("Failed to initialize message queue implementation.\n");
      return(Status);
    }

  Status = InitTimerImpl();
  if (!NT_SUCCESS(Status))
    {
      DPRINT1("Failed to initialize timer implementation.\n");
      return(Status);
    }

  Status = InitAcceleratorImpl();
  if (!NT_SUCCESS(Status))
    {
      DPRINT1("Failed to initialize accelerator implementation.\n");
      return(Status);
    }

  Status = InitGuiCheckImpl();
  if (!NT_SUCCESS(Status))
    {
      DPRINT1("Failed to initialize GUI check implementation.\n");
      return(Status);
    }

  GdiHandleTable = GDIOBJ_iAllocHandleTable(&GdiTableSection);
  if (GdiHandleTable == NULL)
  {
      DPRINT1("Failed to initialize the GDI handle table.\n");
      return STATUS_UNSUCCESSFUL;
  }

  Status = InitDcImpl();
  if (!NT_SUCCESS(Status))
  {
    DPRINT1("Failed to initialize Device context implementation!\n");
    return STATUS_UNSUCCESSFUL;
  }

  /* Initialize FreeType library */
  if (! InitFontSupport())
    {
      DPRINT1("Unable to initialize font support\n");
      return STATUS_UNSUCCESSFUL;
    }

  /* Create stock objects, ie. precreated objects commonly
     used by win32 applications */
  CreateStockObjects();
  CreateSysColorObjects();

  return STATUS_SUCCESS;
}


BOOLEAN STDCALL
Win32kInitialize (VOID)
{
  return TRUE;
}

/* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -