/** * @brief Terminates the calling native process. * @details This routine releases all resources * used by zenwinx library before the process termination. * @param[in] exit_code the exit status. */ void winx_exit(int exit_code) { NTSTATUS Status; kb_close(); winx_flush_dbg_log(0); Status = NtTerminateProcess(NtCurrentProcess(),exit_code); if(!NT_SUCCESS(Status)){ print_post_scriptum("winx_exit: cannot terminate process",Status); } }
/** * @brief Shuts down the computer. * @note If SE_SHUTDOWN privilege adjusting fails * then the computer will not be shut down and the program * will continue the execution after this call. */ void winx_shutdown(void) { NTSTATUS Status; kb_close(); MarkWindowsBootAsSuccessful(); (void)winx_enable_privilege(SE_SHUTDOWN_PRIVILEGE); winx_flush_dbg_log(0); Status = NtShutdownSystem(ShutdownPowerOff); if(!NT_SUCCESS(Status)){ print_post_scriptum("winx_shutdown: cannot shut down the computer",Status); } }
static int out_of_memory_handler(size_t n) { int choice = MessageBox( g_mainFrame ? (HWND)g_mainFrame->GetHandle() : NULL, wxT("Try to release some memory by closing\n") wxT("other applications and click Retry then\n") wxT("or click Cancel to terminate the program."), wxT("UltraDefrag: out of memory!"), MB_RETRYCANCEL | MB_ICONHAND); if(choice == IDCANCEL){ winx_flush_dbg_log(FLUSH_IN_OUT_OF_MEMORY); if(g_mainFrame) // remove system tray icon delete g_mainFrame->m_systemTrayIcon; exit(3); return 0; } return 1; }
/** * @brief Searches for the first movable file block * after the specified cluster on the volume. * @param[in] jp job parameters. * @param[in,out] min_lcn pointer to variable containing * minimum LCN - file blocks below it will be ignored. * @param[in] flags one of SKIP_xxx flags defined in udefrag.h * @param[out] first_file pointer to variable receiving information * about the file the first block belongs to. * @return Pointer to the first block. NULL indicates failure. */ winx_blockmap *find_first_block(udefrag_job_parameters *jp, ULONGLONG *min_lcn, int flags, winx_file_info **first_file) { winx_file_info *found_file; winx_blockmap *first_block; winx_blockmap b; struct file_block fb, *item; struct prb_traverser t; int movable_file; ULONGLONG tm = winx_xtime(); if(min_lcn == NULL || first_file == NULL) return NULL; found_file = NULL; first_block = NULL; b.lcn = *min_lcn; fb.block = &b; prb_t_init(&t,jp->file_blocks); item = prb_t_insert(&t,jp->file_blocks,&fb); if(item == &fb){ /* block at min_lcn not found */ item = prb_t_next(&t); if(prb_delete(jp->file_blocks,&fb) == NULL){ etrace("cannot remove block from the tree"); winx_flush_dbg_log(0); /* 'cause error is critical */ } } if(item){ found_file = item->file; first_block = item->block; } while(!jp->termination_router((void *)jp)){ if(found_file == NULL) break; if(flags & SKIP_PARTIALLY_MOVABLE_FILES){ movable_file = can_move_entirely(found_file,jp); } else { movable_file = can_move(found_file,jp); } if(is_file_locked(found_file,jp)) movable_file = 0; if(movable_file){ if(jp->is_fat && is_directory(found_file) && first_block == found_file->disp.blockmap){ /* skip first fragments of FAT directories */ } else { /* desired block found */ *min_lcn = first_block->lcn + 1; /* the current block will be skipped later anyway in this case */ *first_file = found_file; jp->p_counters.searching_time += winx_xtime() - tm; return first_block; } } /* skip current block */ *min_lcn = *min_lcn + 1; /* and go to the next one */ item = prb_t_next(&t); if(item == NULL) break; found_file = item->file; first_block = item->block; } *first_file = NULL; jp->p_counters.searching_time += winx_xtime() - tm; return NULL; }