Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Как узнать состояние принтера, а так же заданий на принтере.

Следующий пример демонстрирует, как использовать функцию EnumJobs для получения структуры JOB_INFO и как использовать функцию GetPrinter для получения структуры PRINTER_INFO:

Пример

   BOOL GetJobs(HANDLE hPrinter,      /* Дескриптор принтера. */
         JOB_INFO_2 **ppJobInfo, /* Указатель который будем заполнять.*/
         int *pcJobs,            /* Счётчик заданий. */
         DWORD *pStatus)         /* Состояние очереди печати.*/
 
    {
 
    DWORD               cByteNeeded,
                         nReturned,
                         cByteUsed;
     JOB_INFO_2          *pJobStorage = NULL;
     PRINTER_INFO_2       *pPrinterInfo = NULL;
 
    /* Получаем необходимый размер буфера. */
        if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
        {
            if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
                return FALSE;
        }
 
        pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
        if (!(pPrinterInfo))
            /* Ошибка выделения памяти. */
            return FALSE;
 
        /* Получаем информацию о принтере. */
        if (!GetPrinter(hPrinter,
                2,
                (LPSTR)pPrinterInfo,
                cByteNeeded,
                &cByteUsed))
        {
            /* Ошибка доступа к принтеру. */
            free(pPrinterInfo);
            pPrinterInfo = NULL;
            return FALSE;
        }
 
        /* Получаем необходимы размер для заданий. */
        if (!EnumJobs(hPrinter,
                0,
                pPrinterInfo->cJobs,
                2,
                NULL,
                0,
                (LPDWORD)&cByteNeeded,
                (LPDWORD)&nReturned))
        {
            if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
            {
                free(pPrinterInfo);
                pPrinterInfo = NULL;
                return FALSE;
            }
        }
 
        pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
        if (!pJobStorage)
        {
            /* Ошибка выделения памяти для информации о заданиях. */
            free(pPrinterInfo);
            pPrinterInfo = NULL;
            return FALSE;
        }
 
        ZeroMemory(pJobStorage, cByteNeeded);
 
        /* Получаем список заданий. */
        if (!EnumJobs(hPrinter,
                0,
                pPrinterInfo->cJobs,
                2,
                (LPBYTE)pJobStorage,
                cByteNeeded,
                (LPDWORD)&cByteUsed,
                (LPDWORD)&nReturned))
        {
            free(pPrinterInfo);
            free(pJobStorage);
            pJobStorage = NULL;
            pPrinterInfo = NULL;
            return FALSE;
        }
 
        /*
         *  Возвращаем информацию.
         */
        *pcJobs = nReturned;
        *pStatus = pPrinterInfo->Status;
        *ppJobInfo = pJobStorage;
        free(pPrinterInfo);
 
        return TRUE;
 
    }
 
    BOOL IsPrinterError(HANDLE hPrinter)
    {
 
        JOB_INFO_2  *pJobs;
        int         cJobs,
                    i;
        DWORD       dwPrinterStatus;
 
        /*
         *  Получаем информацию о состоянии очереди принтера и
         *  заданиях в очереди принтера.
         */
        if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
            return FALSE;
 
        /*
         *  Если на принтере ошибка, то возвращаем ошибку.
         */
        if (dwPrinterStatus &
            (PRINTER_STATUS_ERROR |
            PRINTER_STATUS_PAPER_JAM |
            PRINTER_STATUS_PAPER_OUT |
            PRINTER_STATUS_PAPER_PROBLEM |
            PRINTER_STATUS_OUTPUT_BIN_FULL |
            PRINTER_STATUS_NOT_AVAILABLE |
            PRINTER_STATUS_NO_TONER |
            PRINTER_STATUS_OUT_OF_MEMORY |
            PRINTER_STATUS_OFFLINE |
            PRINTER_STATUS_DOOR_OPEN))
        {
            return TRUE;
        }
 
        /*
         *  Находим задание в очереди, которое печатается.
         */
        for (i=0; i < cJobs; i++)
        {
            if (pJobs[i].Status & JOB_STATUS_PRINTING)
            {
                /*
                 *  Если задание в состоянии ошибки,
                 *  то возвращаем ошибку.
                 */
                if (pJobs[i].Status &
                    (JOB_STATUS_ERROR |
                    JOB_STATUS_OFFLINE |
                    JOB_STATUS_PAPEROUT |
                    JOB_STATUS_BLOCKED_DEVQ))
                {
                    return TRUE;
                }
            }
        }
 
        /*
         *  Ошибок на принтере нет.
         */
        return FALSE;
 
    }

 

 

 





<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU Проект ReactOS