|
|
1.1 ! root 1: /* Copyright (C) 2004 TrueCrypt Team, truecrypt.org ! 2: This product uses components written by Paul Le Roux <[email protected]> */ ! 3: ! 4: #include "TCdefs.h" ! 5: ! 6: #pragma VxD_LOCKED_CODE_SEG ! 7: #pragma VxD_LOCKED_DATA_SEG ! 8: ! 9: #include "crypto.h" ! 10: #include "apidrvr.h" ! 11: #include "tc9x.h" ! 12: #include "queue.h" ! 13: #include "ifshook.h" ! 14: ! 15: extern int bAllowFastShutdown; ! 16: extern cryptvol *cryptvols[]; ! 17: extern char *transferbuffer; ! 18: ! 19: extern ppIFSFileHookFunc IFSMgr_InstallFileSystemApiHook (pIFSFileHookFunc fcn); ! 20: extern int SHELLHookBroadcast (void *haddress, int ref); ! 21: ! 22: ppIFSFileHookFunc prevhook = NULL; /* address of previous IFS handler */ ! 23: int threadid = -1; /* Handle to the ring0 IO thread */ ! 24: int nSemaphore = 0; /* Sync object for the ring0 IO thread */ ! 25: int terminatethread = 0; /* Used when application reads disk drive.... */ ! 26: ! 27: int ! 28: HookProc (pIFSFunc fsdproc, int fcn, int drive, int flags, int cp, pioreq pir) ! 29: { ! 30: int x, y; ! 31: unsigned int fp; ! 32: char *p; ! 33: ! 34: if (fcn < 2) /* read or write */ ! 35: { ! 36: if (pir->ir_data == (void *) transferbuffer) ! 37: { ! 38: y = pir->ir_options; ! 39: pir->ir_options |= R0_MM_READ_WRITE; ! 40: x = (**prevhook) (fsdproc, fcn, drive, flags, cp, pir); ! 41: pir->ir_options = y; ! 42: return x; ! 43: } ! 44: else ! 45: { ! 46: fp = pir->ir_pos; ! 47: p = (char *) pir->ir_data; ! 48: y = pir->ir_length; ! 49: x = (**prevhook) (fsdproc, fcn, drive, flags, cp, pir); ! 50: ! 51: return x; ! 52: ! 53: } ! 54: } ! 55: ! 56: return (**prevhook) (fsdproc, fcn, drive, flags, cp, pir); ! 57: } ! 58: ! 59: int ! 60: BroadcastMon (int msg, int wparam, int lparam, int ref) ! 61: { ! 62: cryptvol *cv; ! 63: int c; ! 64: ! 65: if (msg == 0x16) /* is it WM_ENDSESSION ? */ ! 66: { ! 67: if (lparam < 0x80000000) /* 0x80000000 is log off */ ! 68: { ! 69: if (bAllowFastShutdown) ! 70: return 1; ! 71: ! 72: for (c = 0; c < 8; c++) ! 73: { ! 74: cv = cryptvols[c]; ! 75: if (cv->booted) ! 76: { ! 77: return 0; ! 78: } ! 79: ! 80: } ! 81: ! 82: ! 83: OnSystemExit (); /* only if NOT log off */ ! 84: } ! 85: ! 86: ! 87: } ! 88: ! 89: if (msg == 0x11 && lparam < 0x80000000) /* is it WM_QUERYENDSESSION ? */ ! 90: { ! 91: if (bAllowFastShutdown) ! 92: return 1; ! 93: ! 94: for (c = 0; c < 8; c++) ! 95: { ! 96: cv = cryptvols[c]; ! 97: if (cv->booted) ! 98: { ! 99: Post_message ("Please dismount all TC drives before attempting to shutdown Windows.", "TC drives still mounted!"); ! 100: return 0; /* This will NOT stop ! 101: WM_ENDSESSION! */ ! 102: } ! 103: } ! 104: } ! 105: ! 106: ! 107: return 1; ! 108: } ! 109: ! 110: void ! 111: installhook (void) ! 112: { ! 113: if (prevhook == NULL) ! 114: { ! 115: prevhook = IFSMgr_InstallFileSystemApiHook (HookProc); ! 116: SHELLHookBroadcast (&BroadcastMon, 0); ! 117: } ! 118: } ! 119: ! 120: void ! 121: InstallTCThread (void) ! 122: { ! 123: if (threadid == -1) ! 124: threadid = installthread (&TCRing0Thread); ! 125: } ! 126: ! 127: ! 128: /* called when TC IO initially queued to wake up our ring 0 thread to handle ! 129: the IO for us */ ! 130: ! 131: void ! 132: wakethread (void) ! 133: { ! 134: Signal_Semaphore (nSemaphore); ! 135: } ! 136: ! 137: ! 138: /* called from broadcast handler */ ! 139: void ! 140: killthread (void) ! 141: { ! 142: if (threadid == -1) ! 143: return; ! 144: terminatethread = 1; ! 145: Signal_Semaphore (nSemaphore); ! 146: } ! 147: ! 148: ! 149: /* This Ring 0 thread handles all TC IO, rather than schedule on global ! 150: events which seem to cause trouble on Win98 */ ! 151: ! 152: void ! 153: TCRing0Thread (void) ! 154: { ! 155: nSemaphore = Create_Semaphore (1); /* task Sleep semaphore */ ! 156: ! 157: while (1) ! 158: { ! 159: Wait_Semaphore (nSemaphore, BLOCK_THREAD_IDLE); ! 160: if (terminatethread) ! 161: break; ! 162: DeQueueIOP (); ! 163: if (terminatethread) ! 164: break; /* May have come in here too! */ ! 165: } ! 166: ! 167: threadid = -1; ! 168: Destroy_Semaphore (nSemaphore); ! 169: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.