设置打印机设置为横向或者纵向打印

本文介绍了一种使用VBA在Windows环境下更改打印机设置的方法,包括如何设置打印方向为横向或纵向。通过调用Windows API函数,可以实现对打印机DevMode结构的修改,从而改变打印方向。

'将打印设置为横向打印:ChngPrinterOrientationLandscape Me
'将打印设置为纵向打印:ChngPrinterOrientationPortrait Me
'将下面的文件存为.BAS文件,在打印窗体加载的时候按上面的方法调用即可

'Constants   used   in   the   DevMode   structure
  Private Const CCHDEVICENAME = 32
  Private Const CCHFORMNAME = 32
   
  'Constants   for   NT   security
  Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
  Private Const PRINTER_ACCESS_ADMINISTER = &H4
  Private Const PRINTER_ACCESS_USE = &H8
  Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
   
  'Constants   used   to   make   changes   to   the   values   contained   in   the   DevMode
  Private Const DM_MODIFY = 8
  Private Const DM_IN_BUFFER = DM_MODIFY
  Private Const DM_COPY = 2
  Private Const DM_OUT_BUFFER = DM_COPY
  Private Const DM_DUPLEX = &H1000&
  Private Const DMDUP_SIMPLEX = 1
  Private Const DMDUP_VERTICAL = 2
  Private Const DMDUP_HORIZONTAL = 3
  Private Const DM_ORIENTATION = &H1&
  Private PageDirection     As Integer
  '------USER   DEFINED   TYPES
   
  'The   DevMode   structure   contains   printing   parameters.
  'Note   that   this   only   represents   the   PUBLIC   portion   of   the   DevMode.
  '     The   full   DevMode   also   contains   a   variable   length   PRIVATE   section
  '     which   varies   in   length   and   content   between   printer   drivers.
  'NEVER   use   this   User   Defined   Type   directly   with   any   API   call.
  '     Always   combine   it   into   a   FULL   DevMode   structure   and   then   send   the
  '     full   DevMode   to   the   API   call.
  Private Type DEVMODE
          dmDeviceName   As String * CCHDEVICENAME
          dmSpecVersion   As Integer
          dmDriverVersion   As Integer
          dmSize   As Integer
          dmDriverExtra   As Integer
          dmFields   As Long
          dmOrientation   As Integer
          dmPaperSize   As Integer
          dmPaperLength   As Integer
          dmPaperWidth   As Integer
          dmScale   As Integer
          dmCopies   As Integer
          dmDefaultSource   As Integer
          dmPrintQuality   As Integer
          dmColor   As Integer
          dmDuplex   As Integer
          dmYResolution   As Integer
          dmTTOption   As Integer
          dmCollate   As Integer
          dmFormName   As String * CCHFORMNAME
          dmLogPixels   As Integer
          dmBitsPerPel   As Long
          dmPelsWidth   As Long
          dmPelsHeight   As Long
          dmDisplayFlags   As Long
          dmDisplayFrequency   As Long
          dmICMMethod   As Long                   '   //   Windows   95   only
          dmICMIntent   As Long                   '   //   Windows   95   only
          dmMediaType   As Long                   '   //   Windows   95   only
          dmDitherType   As Long                 '   //   Windows   95   only
          dmReserved1   As Long                   '   //   Windows   95   only
          dmReserved2   As Long                   '   //   Windows   95   only
  End Type
   
  Private Type PRINTER_DEFAULTS
  'Note:
  '     The   definition   of   Printer_Defaults   in   the   VB5   API   viewer   is   incorrect.
  '     Below,   pDevMode   has   been   corrected   to   LONG.
          pDatatype   As String
          pDevMode   As Long
          DesiredAccess   As Long
  End Type
   
   
  '------DECLARATIONS
   
  Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
  Private Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal Command As Long) As Long
  Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As Long
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
  Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
   
  'The   following   is   an   unusual   declaration   of   DocumentProperties:
  '     pDevModeOutput   and   pDevModeInput   are   usually   declared   ByRef.     They   are   declared
  '     ByVal   in   this   program   because   we're   using   a   Printer_Info_2   structure.
  '     The   pi2   structure   contains   a   variable   of   type   LONG   which   contains   the   address
  '     of   the   DevMode   structure   (this   is   called   a   pointer).     This   LONG   variable   must
  '     be   passed   ByVal.
  '     Normally   this   function   is   called   with   a   BYTE   ARRAY   which   contains   the   DevMode
  '     structure   and   the   Byte   Array   is   passed   ByRef.
  Private Declare Function DocumentProperties Lib "winspool.drv" Alias "DocumentPropertiesA" (ByVal hwnd As Long, ByVal hPrinter As Long, ByVal pDeviceName As String, ByVal pDevModeOutput As Any, ByVal pDevModeInput As Any, ByVal fMode As Long) As Long
   
  Private Sub SetOrientation(NewSetting As Long, chng As Integer, ByVal frm As Form)
          Dim PrinterHandle     As Long
          Dim PrinterName     As String
          Dim pd     As PRINTER_DEFAULTS
          Dim MyDevMode     As DEVMODE
          Dim Result     As Long
          Dim Needed     As Long
          Dim pFullDevMode     As Long
          Dim pi2_buffer()     As Long             'This   is   a   block   of   memory   for   the   Printer_Info_2   structure
                  'If   you   need   to   use   the   Printer_Info_2   User   Defined   Type,   the
                  '     definition   of   Printer_Info_2   in   the   API   viewer   is   incorrect.
                  '     pDevMode   and   pSecurityDescriptor   should   be   defined   As   Long.
           
          PrinterName = Printer.DeviceName
          If PrinterName = "" Then
                  Exit Sub
          End If
           
          pd.pDatatype = vbNullString
          pd.pDevMode = 0&
          'Printer_Access_All   is   required   for   NT   security
          pd.DesiredAccess = PRINTER_ALL_ACCESS
           
          Result = OpenPrinter(PrinterName, PrinterHandle, pd)
           
          'The   first   call   to   GetPrinter   gets   the   size,   in   bytes,   of   the   buffer   needed.
          'This   value   is   divided   by   4   since   each   element   of   pi2_buffer   is   a   long.
          Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
          ReDim pi2_buffer((Needed / 4))
          Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
           
          'The   seventh   element   of   pi2_buffer   is   a   Pointer   to   a   block   of   memory
          '     which   contains   the   full   DevMode   (including   the   PRIVATE   portion).
          pFullDevMode = pi2_buffer(7)
           
          'Copy   the   Public   portion   of   FullDevMode   into   our   DevMode   structure
          Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
           
          'Make   desired   changes
          MyDevMode.dmDuplex = NewSetting
          MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION
          MyDevMode.dmOrientation = chng
           
          'Copy   our   DevMode   structure   back   into   FullDevMode
          Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
           
          'Copy   our   changes   to   "the   PUBLIC   portion   of   the   DevMode"   into   "the   PRIVATE   portion   of   the   DevMode"
          Result = DocumentProperties(frm.hwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
           
          'Update   the   printer's   default   properties   (to   verify,   go   to   the   Printer   folder
          '     and   check   the   properties   for   the   printer)
          Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
           
          Call ClosePrinter(PrinterHandle)
           
          'Note:   Once   "Set   Printer   =   "   is   executed,   anywhere   in   the   code,   after   that   point
          '             changes   made   with   SetPrinter   will   ONLY   affect   the   system-wide   printer     --
          '             --   the   changes   will   NOT   affect   the   VB   printer   object.
          '             Therefore,   it   may   be   necessary   to   reset   the   printer   object's   parameters   to
          '             those   chosen   in   the   devmode.
          Dim p     As Printer
          For Each p In Printers
                  If p.DeviceName = PrinterName Then
                          Set Printer = p
                          Exit For
                  End If
          Next p
          Printer.Duplex = MyDevMode.dmDuplex
  End Sub
'横向打印
  Public Sub ChngPrinterOrientationLandscape(ByVal frm As Form)
          PageDirection = 2
          Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
  End Sub
   
  Public Sub ResetPrinterOrientation(ByVal frm As Form)
     
          If PageDirection = 1 Then
                  PageDirection = 2
          Else
                  PageDirection = 1
          End If
          Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
  End Sub
'纵向打印
  Public Sub ChngPrinterOrientationPortrait(ByVal frm As Form)
   
          PageDirection = 1
          Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
  End Sub
 

内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值