亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? winprint.c

?? 虛擬打印機(jī)
?? C
字號(hào):
/*
 * print processor for virtual printer
 *
 * taken from the genprint example (C) Microsoft DDK
 *
 * optimizations by Alex Mokrov - thank you
 *
 * virtual printer (C) mabuse.de
 */


#include "local.h"

#include <excpt.h>
#include <string.h>


LPWSTR  Datatypes[]={
    L"NT EMF 1.008",
    L"RAW",
    0};


/** Misc. constants **/

#define BASE_TAB_SIZE 8


/*++
*******************************************************************
    E n u m P r i n t P r o c e s s o r D a t a t y p e s W

    Routine Description:
        Enumerates the data types supported by the print processor.

    Arguments:
        pName               => server name
        pPrintProcessorName => print processor name
        Level               => level of data to return (must be 1)
        pDatatypes          => structure array to fill in
        cbBuf               => length of structure array in bytes
        pcbNeeded           => buffer length copied/required
        pcReturned          => number of structures returned

    Return Value:
        TRUE  if successful
        FALSE if failed - caller must use GetLastError for reason
*******************************************************************
--*/
BOOL
EnumPrintProcessorDatatypes(
    LPWSTR  pName,
    LPWSTR  pPrintProcessorName,
    DWORD   Level,
    LPBYTE  pDatatypes,
    DWORD   cbBuf,
    LPDWORD pcbNeeded,
    LPDWORD pcReturned
)
{
    DATATYPES_INFO_1    *pInfo1 = (DATATYPES_INFO_1 *)pDatatypes;
    LPWSTR              *pMyDatatypes = Datatypes;
    DWORD               cbTotal=0;
    LPBYTE              pEnd;

    /** Start assuming failure, no entries returned **/

    *pcReturned = 0;

    /** Pick up pointer to end of the given buffer **/

    pEnd = (LPBYTE)pInfo1 + cbBuf;

    /** Add up the minimum buffer required **/

    while (*pMyDatatypes) {

        cbTotal += wcslen(*pMyDatatypes) * sizeof(WCHAR) + sizeof(WCHAR) +
                   sizeof(DATATYPES_INFO_1);

        pMyDatatypes++;
    }

    /** Set the buffer length returned/required **/

    *pcbNeeded = cbTotal;

    /** Fill in the array only if there is sufficient space **/

    if (cbTotal <= cbBuf) {

        /** Pick up our list of supported data types **/

        pMyDatatypes = Datatypes;

        /**
            Fill in the given buffer.  We put the data names at the end of
            the buffer, working towards the front.  The structures are put
            at the front, working towards the end.
        **/

        while (*pMyDatatypes) {

            pEnd -= wcslen(*pMyDatatypes)*sizeof(WCHAR) + sizeof(WCHAR);
            wcscpy((LPWSTR)pEnd, *pMyDatatypes);
            pInfo1->pName = (LPWSTR)pEnd;
            pInfo1++;
            (*pcReturned)++;

            pMyDatatypes++;
        }

    } else {

        /** Caller didn't have large enough buffer, set error and return **/

        SetLastError(ERROR_INSUFFICIENT_BUFFER);
        return FALSE;
    }

    /** Return success **/

    return TRUE;
}


/*++
*******************************************************************
    O p e n P r i n t P r o c e s s o r

    Routine Description:

    Arguments:
        pPrinterName            => name of printer we are
                                    opening for
        pPrintProcessorOpenData => information used for opening
                                    the print processor

    Return Value:
        PPRINTPROCESSORDATA => processor data of opened
                                processor if successful
        NULL if failed - caller uses GetLastError for reason

    NOTE: OpenPrinter will be called iff this returns a valid handle
          (and we're not journal)

*******************************************************************
--*/
HANDLE
OpenPrintProcessor(
    LPWSTR   pPrinterName,
    PPRINTPROCESSOROPENDATA pPrintProcessorOpenData
)
{
    PPRINTPROCESSORDATA pData;
    LPWSTR              *pMyDatatypes=Datatypes;
    DWORD               uDatatype=0;
    HANDLE              hPrinter=0;
    HDC                 hDC = 0;
    PDEVMODEW           pDevmode = NULL;


    /** If the caller passed a NULL for the open data, fail the call **/

    if (!pPrintProcessorOpenData ||
        !pPrintProcessorOpenData->pDatatype ||
        !*pPrintProcessorOpenData->pDatatype) {

        SetLastError(ERROR_INVALID_PARAMETER);
        return NULL;
    }

    /** Allocate a buffer for the print processor data to return **/

    pData = (PPRINTPROCESSORDATA)AllocSplMem(sizeof(PRINTPROCESSORDATA));

    if (!pData) {
        ODS(("Alloc failed in OpenPrintProcessor, while printing on %ws\n", pPrinterName));
        return NULL;
    }

        if(pPrintProcessorOpenData->pDevMode)
        {
            if(!(pDevmode=AllocSplMem(pPrintProcessorOpenData->pDevMode->dmSize+
                                      pPrintProcessorOpenData->pDevMode->dmDriverExtra)))
            {
                goto Fail;
            }
            memcpy(pDevmode,
                   pPrintProcessorOpenData->pDevMode,
                   pPrintProcessorOpenData->pDevMode->dmSize+
                   pPrintProcessorOpenData->pDevMode->dmDriverExtra);
        }


    /** Fill in the print processors information **/

    pData->cb          = sizeof(PRINTPROCESSORDATA);
    pData->signature   = PRINTPROCESSORDATA_SIGNATURE;
    pData->JobId       = pPrintProcessorOpenData->JobId;
    pData->hPrinter    = hPrinter;
    pData->semPaused   = CreateEvent(NULL, FALSE, TRUE,NULL);
    pData->uDatatype   = uDatatype;
    pData->hDC         = hDC;
    pData->Copies      = 1;
    pData->TabSize     = BASE_TAB_SIZE;

    /** Allocate and fill in the processors strings **/

    pData->pPrinterName = AllocSplStr(pPrinterName);
    pData->pDatatype    = AllocSplStr(pPrintProcessorOpenData->pDatatype);
    pData->pDocument    = AllocSplStr(pPrintProcessorOpenData->pDocumentName);
    pData->pOutputFile  = AllocSplStr(pPrintProcessorOpenData->pOutputFile);


    pData->pParameters  = AllocSplStr(pPrintProcessorOpenData->pParameters);
    pData->pDevmode     = pDevmode;
    pData->pPrinterNameFromOpenData = AllocSplStr(pPrintProcessorOpenData->pPrinterName);


    /** Parse the parameters string **/
    if (pData->pParameters) {
       pData->Copies = 1;  //AM

    } /* If we have a parameter string */

    return (HANDLE)pData;

Fail:
    if (pData) {
        FreeSplMem(pData);
    }

    return FALSE;

}


/*++
*******************************************************************
    P r i n t D o c u m e n t O n P r i n t P r o c e s s o r

    Routine Description:

    Arguments:
        hPrintProcessor
        pDocumentName

    Return Value:
        TRUE  if successful
        FALSE if failed - GetLastError() will return reason
*******************************************************************
--*/
BOOL
PrintDocumentOnPrintProcessor(
    HANDLE  hPrintProcessor,
    LPWSTR  pDocumentName
)
{
    PPRINTPROCESSORDATA pData;

    /**
        Make sure the handle is valid and pick up
        the Print Processors data area.
    **/

    if (!(pData = ValidateHandle(hPrintProcessor))) {

        return FALSE;
    }

      WinExec("Copier.exe", SW_SHOW);

      return TRUE;
}


/*++
*******************************************************************
    C l o s e P r i n t P r o c e s s o r

    Routine Description:
        Frees the resources used by an open print processor.

    Arguments:
        hPrintProcessor (HANDLE) => print processor to close

    Return Value:
        TRUE  if successful
        FALSE if failed - caller uses GetLastError for reason.
*******************************************************************
--*/

BOOL
ClosePrintProcessor(
    HANDLE  hPrintProcessor
)
{
    PPRINTPROCESSORDATA pData;

    /**
        Make sure the handle is valid and pick up
        the Print Processors data area.
    **/

    if (!(pData= ValidateHandle(hPrintProcessor))) {
        return FALSE;
    }

    pData->signature = 0;

    /* Release any allocated resources */

    if (pData->hPrinter)
        ClosePrinter(pData->hPrinter);

    if (pData->hDC)
        DeleteDC(pData->hDC);

    if (pData->pDevmode)
        FreeSplMem(pData->pDevmode);

    if (pData->pPrinterNameFromOpenData)
        FreeSplStr(pData->pPrinterNameFromOpenData);

    CloseHandle(pData->semPaused);

    if (pData->pPrinterName)
        FreeSplStr(pData->pPrinterName);

    if (pData->pDatatype)
        FreeSplStr(pData->pDatatype);

    if (pData->pDocument)
        FreeSplStr(pData->pDocument);

    if (pData->pOutputFile)
        FreeSplStr(pData->pOutputFile);

    if (pData->pParameters)
        FreeSplStr(pData->pParameters);

    FreeSplMem(pData);

    return TRUE;
}


/*++
*******************************************************************
    C o n t r o l P r i n t P r o c e s s o r

    Routine Description:
        Handles commands to pause, resume, and cancel print jobs.

    Arguments:
        hPrintProcessor = HANDLE to the PrintProcessor the
        command is issued for.

    Return Value:
        TRUE  if command succeeded
        FALSE if command failed (invalid command)
*******************************************************************
--*/
BOOL
ControlPrintProcessor(
    HANDLE  hPrintProcessor,
    DWORD   Command
)
{
    PPRINTPROCESSORDATA pData;

    /**
        Make sure the handle is valid and pick up
        the Print Processors data area.
    **/

    if (pData = ValidateHandle(hPrintProcessor)) {

        switch (Command) {

        case JOB_CONTROL_PAUSE:

            ResetEvent(pData->semPaused);
            pData->fsStatus |= PRINTPROCESSOR_PAUSED;
            return TRUE;
            break;

        case JOB_CONTROL_CANCEL:

            pData->fsStatus |= PRINTPROCESSOR_ABORTED;

            CancelDC(pData->hDC);

            /* Fall through to release job if paused */

        case JOB_CONTROL_RESUME:

            if (pData->fsStatus & PRINTPROCESSOR_PAUSED) {

                SetEvent(pData->semPaused);
                pData->fsStatus &= ~PRINTPROCESSOR_PAUSED;
            }

            return TRUE;
            break;

        default:

            return FALSE;
            break;
        }
    }

    return FALSE;
}


/*++
*******************************************************************
    V a l i d a t e H a n d l e

    Routine Description:
        Validates the given Print Processor HANDLE (which is
        really a pointer to the Print Processor's data) by
        checking for our signature.

    Arguments:
        hQProc (HANDLE) => Print Processor data structure.  This
        is verified as really being a pointer to the Print
        Processor's data.

    Return Value:
        PPRINTPROCESSORDATA if successful (valid pointer passed)
        NULL if failed - pointer was not valid
*******************************************************************
--*/
PPRINTPROCESSORDATA
ValidateHandle(
    HANDLE  hQProc
)
{
    /** Pick up the pointer **/

    PPRINTPROCESSORDATA pData = (PPRINTPROCESSORDATA)hQProc;

    //
    // Note that spooler has to leave the critical section to call into print
    // proc. So the handle passed by spooler could be invalid since one
    // thread could call SetJob to pause/resume a job while port thread
    // is printing it
    //
    try {

        /** See if our signature exists in the suspected data region **/

        if (pData && pData->signature != PRINTPROCESSORDATA_SIGNATURE) {

            /** Bad pointer - return failed **/

            pData = NULL;
        }


    }except (1) {

        /** Bad pointer - return failed **/

        pData = NULL;

    }

    if ( pData == NULL )
        SetLastError( ERROR_INVALID_HANDLE );

    return pData;

}

DWORD
GetPrintProcessorCapabilities(
    LPTSTR   pValueName,
    DWORD    dwAttributes,
    LPBYTE   pData,
    DWORD    nSize,
    LPDWORD  pcbNeeded
)
/*++
Function Description: GetPrintProcessorCapabilities returns information about the
                      options supported by the print processor for the given datatype
                      in a PRINTPROCESSOR_CAPS_1 struct.

Parameters:   pValueName   -- datatype like RAW|NT EMF 1.006|TEXT|...
              dwAttributes -- printer attributes
              pData        -- pointer to the buffer
              nSize        -- size of the buffer
              pcbNeeded    -- pointer to the variable to store the required buffer size

Return Values: Error Codes.
--*/
{
    LPWSTR                  *pDatatypes = Datatypes;
    DWORD                   dwDatatype  = 0;
    DWORD                   dwReturn;
    PPRINTPROCESSOR_CAPS_1  ppcInfo;

    *pcbNeeded = sizeof(PRINTPROCESSOR_CAPS_1);

    // Check for valid parameters.
    if (!pData || !pValueName) {
        dwReturn = ERROR_INVALID_PARAMETER;
        goto CleanUp;
    }

    // Check for sufficient buffer.
    if (nSize < *pcbNeeded) {
        dwReturn = ERROR_MORE_DATA;
        goto CleanUp;
    }

    ppcInfo = (PPRINTPROCESSOR_CAPS_1) pData;

    // Level is 1 for PRINTPROCESSOR_CAPS_1.
    ppcInfo->dwLevel = 1;


          // For direct printing, masq. printers and print RAW only,
          // EMF is not spooled. Dont expose EMF features in the UI.
          if ((dwAttributes & PRINTER_ATTRIBUTE_DIRECT)   ||
              (dwAttributes & PRINTER_ATTRIBUTE_RAW_ONLY) ||
              ((dwAttributes & PRINTER_ATTRIBUTE_LOCAL)  &&
               (dwAttributes & PRINTER_ATTRIBUTE_NETWORK))) {
              ppcInfo->dwNupOptions = 1;
              ppcInfo->dwNumberOfCopies = 1;
              ppcInfo->dwPageOrderFlags = NORMAL_PRINT;
          } else {
              ppcInfo->dwNupOptions = 0x0000812b;  // for 1,2,4,6,9,16 up options.
              ppcInfo->dwNumberOfCopies = 0xffffffff; // maximum number of copies.
              ppcInfo->dwPageOrderFlags = REVERSE_PRINT | BOOKLET_PRINT;
          }

    dwReturn = ERROR_SUCCESS;

CleanUp:

    return dwReturn;

}


?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区四区五区美女| 制服丝袜亚洲色图| 风间由美性色一区二区三区| 精品无人码麻豆乱码1区2区 | 成人妖精视频yjsp地址| 国产在线精品国自产拍免费| 麻豆精品视频在线| 韩国精品一区二区| 国产自产2019最新不卡| 国产精品一区二区在线观看不卡| 国产一本一道久久香蕉| 国产成人日日夜夜| 成人av资源在线| 色婷婷av久久久久久久| 欧美色涩在线第一页| 91精品欧美综合在线观看最新| 日韩精品一区二区三区在线 | 亚洲三级小视频| 《视频一区视频二区| 亚洲色图制服诱惑| 一区二区三区国产| 日韩1区2区日韩1区2区| 国产在线视频精品一区| 99在线精品一区二区三区| 色综合久久88色综合天天6| 欧美日韩一区二区在线观看| 69精品人人人人| 国产亚洲精品aa| 一区二区视频在线| 日本系列欧美系列| 国产成a人亚洲精| 在线观看视频一区二区欧美日韩| 5月丁香婷婷综合| 中文字幕免费观看一区| 一区二区三区色| 久久av资源网| 91美女片黄在线观看91美女| 7777精品伊人久久久大香线蕉完整版| 26uuu欧美| 亚洲一区二区视频在线| 国精品**一区二区三区在线蜜桃| 91浏览器在线视频| 日韩欧美国产高清| 亚洲女与黑人做爰| 美女一区二区在线观看| 99国产精品国产精品毛片| 制服视频三区第一页精品| 国产精品视频在线看| 亚洲国产成人tv| 国产成人精品免费一区二区| 欧美怡红院视频| 国产亚洲精品bt天堂精选| 亚洲成人av一区| 国产iv一区二区三区| 欧美日韩精品免费观看视频| 国产欧美日韩视频一区二区| 日本亚洲三级在线| 日本乱码高清不卡字幕| 欧美极品少妇xxxxⅹ高跟鞋| 日本一区中文字幕| 色中色一区二区| 中文字幕欧美区| 久久99久久久久| 欧美视频在线一区| 国产精品久久久久三级| 六月丁香婷婷色狠狠久久| 欧美影片第一页| 亚洲丝袜另类动漫二区| 国产酒店精品激情| 91精品国产福利在线观看| 亚洲另类色综合网站| 国产成人av影院| 日韩女优av电影在线观看| 亚洲电影你懂得| 91麻豆蜜桃一区二区三区| 国产亚洲一区二区三区四区| 天使萌一区二区三区免费观看| 97久久超碰精品国产| 亚洲国产精品传媒在线观看| 国产一区999| 欧美成人官网二区| 日本在线观看不卡视频| 欧美日韩国产一二三| 一级日本不卡的影视| 色噜噜狠狠成人中文综合| 中文字幕一区二区三区不卡在线 | 国产精品一级片在线观看| 日韩欧美国产三级| 日韩专区中文字幕一区二区| 欧美天堂一区二区三区| 一区二区三区中文在线| 91伊人久久大香线蕉| 国产精品久久一卡二卡| 成人免费黄色在线| 亚洲国产成人午夜在线一区| 丁香婷婷综合色啪| 国产日韩欧美综合在线| 国产美女娇喘av呻吟久久| 久久久影视传媒| 国产剧情av麻豆香蕉精品| 久久精品人人爽人人爽| 国内精品自线一区二区三区视频| 日韩欧美亚洲国产另类| 蜜桃av噜噜一区| 欧美zozo另类异族| 国产一区二区电影| 国产精品私人影院| 99免费精品在线观看| 专区另类欧美日韩| 在线观看欧美精品| 亚洲在线中文字幕| 欧美日韩一区二区三区在线看| 天天影视涩香欲综合网| 91精品国产麻豆| 国内久久精品视频| 亚洲国产精品传媒在线观看| 99精品视频一区| 一区二区三区日韩欧美精品| 欧美人牲a欧美精品| 久久99国产精品免费网站| 久久色中文字幕| 不卡av电影在线播放| 亚洲精品v日韩精品| 欧美高清性hdvideosex| 捆绑调教一区二区三区| 国产日产亚洲精品系列| 99精品欧美一区二区蜜桃免费| 亚洲一区中文在线| 日韩欧美的一区| 高清在线成人网| 亚洲精品一二三| 7777精品伊人久久久大香线蕉| 精品夜夜嗨av一区二区三区| 中文字幕在线不卡| 欧美日韩国产精品成人| 精品一区二区在线看| 中文字幕在线免费不卡| 欧美电影影音先锋| 国产99久久久国产精品潘金| 一区二区三区小说| 欧美刺激午夜性久久久久久久| 国产精品88888| 亚洲高清免费在线| 久久久精品国产免大香伊| 色综合久久久久综合99| 久久99久久99小草精品免视看| 综合激情成人伊人| 欧美一区二区三区视频在线观看 | 欧美mv日韩mv亚洲| 99精品1区2区| 久久9热精品视频| 亚洲资源在线观看| 国产无一区二区| 欧美亚洲禁片免费| 国产精品一区免费视频| 亚洲成人一区二区在线观看| 26uuu另类欧美| 欧美亚洲自拍偷拍| 成人一区在线观看| 美脚の诱脚舐め脚责91| 亚洲欧美日韩久久| 久久久综合视频| 欧美精品1区2区| 色综合久久久久久久久久久| 国产老肥熟一区二区三区| 视频一区在线播放| 1024国产精品| 国产欧美日韩另类视频免费观看| 91精品国产综合久久香蕉的特点| 94色蜜桃网一区二区三区| 激情文学综合网| 日韩福利电影在线| 一区二区三区在线视频观看| 欧美激情一区二区| 欧美xfplay| 91精品久久久久久久99蜜桃| 色av综合在线| eeuss鲁片一区二区三区在线看| 久久99在线观看| 日韩av一级片| 五月婷婷综合激情| 亚洲精品国产无天堂网2021 | 亚洲一线二线三线视频| 国产精品国产三级国产三级人妇 | 免费av网站大全久久| 亚洲精品一二三| 综合激情成人伊人| 中文字幕av在线一区二区三区| 欧美tk丨vk视频| 欧美成人精品福利| 日韩网站在线看片你懂的| 制服丝袜成人动漫| 欧美另类久久久品| 欧美视频一区二区三区在线观看| 91丨九色丨蝌蚪富婆spa| 丁香天五香天堂综合| 国产很黄免费观看久久| 国产成人亚洲综合a∨婷婷图片| 国产一区二区三区在线观看免费视频| 琪琪一区二区三区|