求编程高手解决一个小问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求编程高手解决一个小问题相关的知识,希望对你有一定的参考价值。

最近在学习api hook的编程,下面是程序段:
HookApi.h
#ifndef _HOOKAPI_H
#define _HOOKAPI_H
class CHOOKAPI
public:
LPVOID pOldFunEntry, pNewFunEntry ; // 初始函数地址、HOOK后的函数地址
BYTE bOldByte[5], bNewByte[5] ; // 原始字节、目标字节
public:
CHOOKAPI ()
~CHOOKAPI()
// 实现HOOK API
void Hook ( PSTR szModuleName, PSTR szFunName, FARPROC pFun )

HMODULE hMod = ::GetModuleHandleA ( szModuleName ) ;
if ( hMod != NULL )

pNewFunEntry = (LPVOID)pFun ;
pOldFunEntry = (LPVOID)GetProcAddress ( hMod, szFunName ) ;
bNewByte[0] = 0xE9 ;
*((PDWORD)(&(bNewByte[1]))) = (DWORD)pNewFunEntry - (DWORD)pOldFunEntry -5 ;
DWORD dwProtect, dwWriteByte, dwReadByte ;
VirtualProtect ( (LPVOID)pOldFunEntry, 5, PAGE_READWRITE, &dwProtect );
ReadProcessMemory ( GetCurrentProcess(), (LPVOID)pOldFunEntry, bOldByte, 5, &dwReadByte ) ;
WriteProcessMemory ( GetCurrentProcess(), (LPVOID)pOldFunEntry, bNewByte, 5, &dwWriteByte ) ;
VirtualProtect ( (LPVOID)pOldFunEntry, 5, dwProtect, NULL ) ;


// 重新HOOK
void ReHook ()

DWORD dwProtect, dwWriteByte ;
VirtualProtect ( pOldFunEntry, 20, PAGE_READWRITE, &dwProtect );
WriteProcessMemory ( GetCurrentProcess(), pOldFunEntry, bNewByte, 5, &dwWriteByte ) ;
VirtualProtect ( pOldFunEntry, 20, dwProtect, NULL ) ;

// 撤消HOOK
void UnHook ()

DWORD dwProtect, dwWriteByte ;
VirtualProtect ( pOldFunEntry, 5, PAGE_READWRITE, &dwProtect );
WriteProcessMemory ( GetCurrentProcess(), pOldFunEntry, bOldByte, 5, &dwWriteByte ) ;
VirtualProtect ( pOldFunEntry, 5, dwProtect, NULL ) ;

;
#endif

HookApi.cpp
#include <windows.h>
#include "HookApi.h"
CHOOKAPI HookItem ;
// 定义MessageBoxA函数原型
typedef int (WINAPI* PFNMessageBoxA)( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType ) ;
// 自定义的MessageBoxA函数
// 实现对原始MessageBoxA的输入、输出参数的监控,甚至是取消调用
int WINAPI NEW_MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType )

// 撤消HOOK
HookItem.UnHook () ;
// 此处可以观察/修改调用参数,甚至可以取消调用直接返回。
// ……
// 取得原函数地址
PFNMessageBoxA pfnMessageBoxA = (PFNMessageBoxA)HookItem.pOldFunEntry ;
// 调用原函数,修改输入参数
int ret = pfnMessageBoxA ( hWnd, "这是HOOK函数过程的消息框", "[测试]", uType ) ;
// 此处可以查看/修改调用原函数的返回值
// ……
// 重新HOOK
HookItem.ReHook () ;
return ret ;

int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )

// 原始API
MessageBoxA ( 0, "正常消息框", "测试", 0 ) ;
// HOOK API
HookItem.Hook ( "USER32.dll", "MessageBoxA", (FARPROC)NEW_MessageBoxA ) ;

// 调用API,测试
MessageBoxA ( 0, "正常消息框", "测试", 0 ) ;
// 撤消HOOK
HookItem.UnHook () ;
return 0 ;


程序运行之后警告内存非法存取,可是红色字体段应该已经修改存取权限了,非常不理解,求解释

参考技术A 你是不是要在最后一个数输出后直接换行,那就这么改:
for(i=1;i<=n;i++)
printf("%d",a[i]); //注意这里不加空格
if(i==n)
putchar('\n');
else
putchar(' '); //空格在这里

求EBS高手,介绍EBS 中一个Order的具体流程.

就是一个order是怎么来的,从最开始Customer选产品开始,
不要从别的地方考资料来,我已经查了很多,但说法不一。希望是你自己对EBS的业务理解。
比如生成order,再实际中就是生成一个订单,
pick release ,再现实中就是再制定的库中条要发货的产品。

我现在就是EBS里面的一些流程清楚,但是在现实中是个什么操作不是很明白,希望高手能帮忙解答。
分数不是问题,要是解决了我的问题,给500也可以。

1. EBS中建立Customer资料(包括Ship to/Bill to详细信息)
2. 订单员与Customer线外确认订单信息后,录入EBS系统,形成Sales Order;登记时,系统自动对客户进行信用检查。
3. 由订单员根据库存情况确认实际发货时间,进行Pick Release
4. Pick Release后自动生成Move order,并通知库存,库存进行备货(处理Move order),将货物从实际货位挑到待发区
5. 待运输车到后,从待发区将货物拉走,并在系统中做相应的Ship confirm.此时,系统会产生销售出库事务处理及分录(确认销货成本),及将OM数据传递到AR(确认销货收入)。
这是比较普通的流程。希望对你有帮助。追问

谢谢你的回答,
order的过程中有一个叫BOOKING和BILL的过程,这是在那个阶段呢.
或者说是什么叫BOOK ORDER,,什么叫BILL,
再实际业务是什么意思
谢谢。

追答

BOOKING:
第2点里面有个登记(BOOKING)。主要是在录入订单后的操作,由系统根据目前Customer的可用信用额度自动判断,是信用通过还是暂挂(暂挂的订单不允许进行挑库)
BILL:
第5点里面有OM数据传递到AR。这个就是你说的BIll,一般在发运确认后,系统就会将OM数据自动传递到AR模块。运行自动化请求,就会将这些SO信息自动生成发票(Bill)

参考技术A 我公司用的是ERP。
对重要的客户是有开放ORDER录入口的。
每个客户都有自己的代码,录入货号、数量、纳期等信息,确认后就生成了。追问

谢谢你的回答,
这些EBS的流程我都知道,我想知道的是这些业务在现实的过程,
如果你有理解的话,帮忙发表一下意见。

参考技术B 我公司用的是ERP。
对重要的客户是有开放ORDER录入口的。

以上是关于求编程高手解决一个小问题的主要内容,如果未能解决你的问题,请参考以下文章

跪求高手用java做一个简易微博系统设计

急求一道编程题

C语言编程,求助高手

WinForm的问题,求高手帮忙~

程序高手来

使用Keil开发ARM编程问题,请编程高手指点一下:为啥用了一条#if(1)的预编译指令?1就表示条件为真