LPDEVMODE GetLandscapeDevMode(HWND hWnd, char *pDevice)
   {
       HANDLE      hPrinter;
       LPDEVMODE   pDevMode;
       DWORD       dwNeeded, dwRet;

       /* Start by opening the printer */
       if (!OpenPrinter(pDevice, &hPrinter, NULL))
           return NULL;

       /*
        * Step 1:
        * Allocate a buffer of the correct size.
        */
       dwNeeded = DocumentProperties(hWnd,
           hPrinter,       /* handle to our printer */
           pDevice,        /* Name of the printer */
           NULL,           /* Asking for size so */
           NULL,           /* these are not used. */
           0);             /* Zero returns buffer size. */
       pDevMode = (LPDEVMODE)malloc(dwNeeded);

       /*
        * Step 2:
        * Get the default DevMode for the printer and
        * modify it for our needs.
        */
       dwRet = DocumentProperties(hWnd,
           hPrinter,
           pDevice,
           pDevMode,       /* The address of the buffer to fill. */
           NULL,           /* Not using the input buffer. */
           DM_OUT_BUFFER); /* Have the output buffer filled. */
       if (dwRet != IDOK)
       {
           /* if failure, cleanup and return failure */
           free(pDevMode);
           ClosePrinter(hPrinter);
           return NULL;
       }

       /*
        * Make changes to the DevMode which are supported.
        */
       if (pDevMode->dmFields & DM_ORIENTATION)
       {
           /* if the printer supports paper orientation, set it*/
           pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
       }

       if (pDevMode->dmFields & DM_DUPLEX)
       {
           /* if it supports duplex printing, use it */

           pDevMode->dmDuplex = DMDUP_HORIZONTAL;
       }

       /*
        * Step 3:
        * Merge the new settings with the old.
        * This gives the driver a chance to update any private
        * portions of the DevMode structure.
        */
       dwRet = DocumentProperties(hWnd,
           hPrinter,
           pDevice,
           pDevMode,       /* Reuse our buffer for output. */
           pDevMode,       /* Pass the driver our changes. */
           DM_IN_BUFFER |  /* Commands to Merge our changes and */
           DM_OUT_BUFFER); /* write the result. */

       /* Done with the printer */
       ClosePrinter(hPrinter);

       if (dwRet != IDOK)
       {
           /* if failure, cleanup and return failure */
           free(pDevMode);
           return NULL;
       }

       /* return the modified DevMode structure */
       return pDevMode;

   }

