OSDN Git Service

first commit
[winexe-harib/winexe-harib.git] / haribote / ThreadMan.cpp
1 #include "ThreadMan.h"
2 #include "debug.h"
3 #include "typedefs.h"
4 #include "ProcessMan.h"
5 #include "naskfunc.h"
6 #include <stdlib.h>
7 #include <string.h>
8
9 BYTE ThreadMan::buf[sizeof(ThreadMan)];
10
11
12 Thread::Thread(Process *p, DWORD tid, DWORD eip)
13 :p(p),tid(tid)
14 {
15         DWORD gdtsize = 0x400, idtsize = 0x800;
16         dtbuf.reset((BYTE *)MemMan::Inst().malloc(true, false, p->getpid()));
17
18         DWORD dtva = p->VirtualAlloc(0xc0000000, true, (DWORD)dtbuf.get());
19
20         dt.init((DWORD)dtbuf.get(), ((DWORD)dtbuf.get()) + gdtsize
21                 , gdtsize - 1, idtsize - 1);
22
23         TSS32 *tsslist = (TSS32 *)(((DWORD)dtbuf.get()) + gdtsize + idtsize);
24         tss.reset(&tsslist[0], placementdeleter());
25         systss.reset(&tsslist[1], placementdeleter());
26         memset(tss.get(), 0, sizeof(TSS32));
27         memset(systss.get(), 0, sizeof(TSS32));
28
29         debugprint("systss:%p\n", systss.get());
30
31         dt.init_app_gdtidt(tss.get(), systss.get());
32
33
34         //\83X\83^\83b\83N\97Ì\88æ\82Æ\82µ\82Ä1MB\83\8a\83U\81[\83u
35         DWORD esp = p->VirtualAlloc(0xf00000, false, 0, false, 0x100);
36         p->VirtualAlloc(esp, false, 0, false, 2, false, true);
37         
38         tss->ldtr = 0;
39         tss->iomap = 0x40000000;
40         tss->fs = tss->ds = tss->es = tss->gs = tss->ss = 1 << 3;
41         tss->cs = 2 << 3;
42         tss->esp = esp;
43         //tss->cr3 = p->getcr3();
44         tss->cr3 = SYSTEM_PAGE_DIRECTORY_PHY;
45         tss->eflags = 0x00000202;
46         tss->eax = tss->ecx = tss->edx = tss->edi = tss->esi = tss->ebp = tss->ebx = 0;
47         tss->eip = eip;
48         tss->eax = dtva;
49         tss->ecx = p->getcr3();
50
51         systss->ldtr = 0;
52         systss->iomap = 0x40000000;
53         systss->cr3 = SYSTEM_PAGE_DIRECTORY_PHY;
54 }
55
56 Thread::~Thread(){
57 }
58
59
60 void Thread::seteip(DWORD eip){
61         tss->eip = eip;
62 }
63
64 void Thread::SwitchThread(){
65         store_cr3(p->getcr3());
66         dt.load();
67         dt.load_systr();
68         dt.jump_to_task();
69 }
70
71 void ThreadMan::Init(void)
72 {
73         new ((void *)buf) ThreadMan();
74 }
75
76 ThreadMan::ThreadMan(void)
77 :thlist(0)
78 {
79         curtid = 1;
80         curthread = 0;
81 }
82
83
84 ThreadMan::~ThreadMan(void)
85 {
86 }
87
88 Thread *ThreadMan::CreateThread(Process *p, DWORD eip){
89         Thread t(p, curtid++, eip);
90         thlist.Add(t);
91         return thlist[thlist.GetCount() - 1];
92 }
93
94 void ThreadMan::SwitchThread(){
95         if(curthread == 0){
96                 if(thlist.GetCount() < 1){
97                         return;
98                 }
99                 Thread *t = thlist[0];
100                 t->SwitchThread();
101         }
102
103 }