|
|
Em dùng Volumeid.exe, gõ lệnh trong cmd: volumeid c: 5555-7777 để đổi volume id của ổ C, sau đó em khởi động lại máy thì không thể boot được vào win
Em dùng đĩa boot, chạy pq magic thì thấy là cái ổ Win của em hồi trước là ổ C nhưng h thì ko còn drive letter nữa, còn ổ dữ liệu trước kia là ổ D nay lại thành ổ C.
Có ai biết cách khắc phục thì nói giùm em với, cám ơn mọi người rât nhiều!
|
|
|
Em kiểm tra lại rồi, cả 2 chương trình đều chạy dc cả, chắc mạng có vấn đề!
|
|
|
Mọi người ơi, mình đã thử mãi rồi nhưng vẫn chưa thể bắt các gói tin qua ethernet bình thường như khi viết ko có class:
foo.cpp: hiện Hello mỗi khi có gói tin nào đi qua:
Code:
#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <iostream>
#include <fstream>
using namespace std;
void my_callback(u_char *useless,const struct pcap_pkthdr* hdr,const u_char* packet)
{
cout << "Hello\n";
}
int main()
{
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *descr;
cout << "Start\n";
dev = pcap_lookupdev(errbuf);
if(dev == NULL) {
printf("%s\n",errbuf);
exit(1);
}
descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
if(descr == NULL) {
printf("pcap_open_live(): %s\n",errbuf);
exit(1);
}
pcap_loop(descr,-1,my_callback,NULL);
pcap_close(descr);
return 0;
}
Còn đây là bài mình chuyển sang viết có class:
dialogimpl.h:
Code:
#ifndef DIALOGIMPL_H
#define DIALOGIMPL_H
//
#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <iostream>
#include <fstream>
using namespace std;
class DialogImpl
{
public:
static void my_callback(u_char *useless, const struct pcap_pkthdr* hdr, const u_char* packet) {
DialogImpl *This = (DialogImpl*)useless;
This->got_packet(hdr, packet);
}
void got_packet(const struct pcap_pkthdr* hdr, const u_char* packet);
void sniffer();
};
#endif
dialogimpl.cpp:
Code:
#include "dialogimpl.h"
void DialogImpl::got_packet(const struct pcap_pkthdr* hdr, const u_char* packet) {
cout << "Hello";
}
void DialogImpl::sniffer()
{
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *descr;
cout << "Bat dau\n";
dev = pcap_lookupdev(errbuf);
if(dev == NULL) {
printf("%s\n",errbuf);
exit(1);
}
descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
if(descr == NULL) {
printf("pcap_open_live(): %s\n",errbuf);
exit(1);
}
pcap_loop(descr,-1,my_callback,(u_char*)this);
pcap_close(descr);
}
main.cpp:
Code:
#include "dialogimpl.h"
int main()
{
DialogImpl win;
win.sniffer();
return 0;
}
Có ai biết tại sao mà hàm pcap_loop kia lại ko thể hoạt động được ko? Mình đã loay hoay với hàm callback này mấy ngày nay rồi mà vẫn chưa giải quyết được, cám ơn sự giúp đỡ của mọi người rất nhiều!
Ghi chú:
- Compile foo.cpp: g++ foo.cpp -lpcap
- Compile main.cpp và dialogimpl.cpp: g++ main.cpp dialogimpl.cpp -lpcap
- Chạy chương trình với sudo: sudo ./a.out
|
|
|
Cám ơn các bạn, mình đã compile được, nhưng có vẻ như vẫn còn 1 lỗi nào đó trong hàm pcap_loop làm cho chương trình bị treo, mình sẽ xem lại!
|
|
|
Em có 1 class DialogImpl:
Code:
class DialogImpl
{
public:
void my_callback(u_char *useless, const struct pcap_pkthdr* hdr, const u_char* packet);
public slots:
void sniffer();
// ............ và 1 số hàm khác
}
Method sniffer() của em nó có cái hàm này:
Code:
DialogImpl::sniffer() {
//............
pcap_loop(descr,-1,my_callback,NULL);
//................
}
Nếu làm vậy thì em sẽ bị thông báo lỗi là argument of type ‘void (DialogImpl:: )(u_char*, const pcap_pkthdr*, const u_char*)’ does not match ‘void ( * )(u_char*, const pcap_pkthdr*, const u_char*)’
Qua tìm kiếm thì em biết dc rằng cần phải set static cho hàm thành viên my_callback. Nhưng khi làm thế thì các hàm liên quan đến GUI trong my_callback sẽ ko thể gọi được nên em muốn tìm 1 cách khác. Liệu có giải pháp nào tốt hơn ko ạ?
Cám ơn các anh trước nhé!
|
|
|
Em đã xử lý dc rồi, do hồi trước em chưa hiểu rõ về thread trong QT nên nó mới nảy sinh ra vấn đề
|
|
|
Em diễn đạt hơi khó hiểu phải ko ạ, em sửa lại rồi đấy, các anh có thể giúp em được ko ạ?
|
|
|
Em mới bắt đầu nghiên cứu về lập trình QT, có 1 vấn đề ko giải quyết được, mong mọi người giúp đỡ. Em dùng QDevelop trên Linux để làm bài, em đọc phần thread nhưng gặp 1 chút rắc rối:
Em dùng QT Designer để tạo ra 1 listWidget trên dialog
Sau đó em tạo 1 class Thread. Em muốn cho cái thread được khai báo trong Dialog có khả năng hiện 1 xâu ví dụ như "Hello" chẳng hạn lên listWidget thì phải làm thế nào ạ? Em đã gọi hàm listWidget->addItem("Hello") trong hàm Thread::run() nhưng ko dc vì hàm đấy chỉ có thể gọi dc trong lớp DialogImpl mà thôi. Làm sao để giải quyết được vấn đề này ạ?
Cho em cám ơn các anh trước nhé!
Project đơn giản em làm để test: http://www.2shared.com/file/5895651/a1b0b8cf/d_online.html
|
|
|
Cái này thì em đã sửa được rồi, lập trình trên windows thì mình phải khai báo thêm hàm WSAAsyncSelect (SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent) để nhận các event từ network cho socket.
|
|
|
Cám ơn các anh đã góp ý!
|
|
|
Anh ơi, thế có cách nào kết thúc luôn cái hàm Try() đó ko ạ, tức là giả sử đang chạy, hiện ra 1 cái dialog, trên dialog có 1 nút, khi click vào thì dừng lại ko chạy nữa ý ạ?
|
|
|
Cám ơn anh, em làm được rồi!
|
|
|
Hình như các anh ko vào đc 4shared hay sao ý nhỉ, em up lại lên mediafire rồi đấy. Có anh nào biết giải thích hộ em với nhé, cám ơn các anh!
|
|
|
Em fix lại cái link ở trên rồi đấy ạ.
|
|
|
Đây là projet của em, chưa có gì đâu ạ, chỉ có phần khởi tạo socket và kết nỗi thôi ạ, nhưng ko hiểu sao khi em click vào nút Listen thì chương trình lại bị treo?
http://www.mediafire.com/?gozgnqb04d9
Code:
void CServerDlg::OnListen()
{
ObjSock.Listen(sock);
}
Code:
int Socket::Listen(SOCKET server_socket)
{
SOCKET client_socket;
struct sockaddr_in adresse;
int adresse_size = 0;
memset(&adresse, 0, sizeof(struct sockaddr_in));
if (listen(server_socket, 0) == SOCKET_ERROR)
return (-1);
adresse_size = sizeof(adresse);
client_socket = accept(server_socket, (struct sockaddr *) &adresse, &adresse_size);
return (0);
}
Các anh có thể cho em biết tại sao ko ạ?
Cám ơn các anh trước nhé!
|
|
|
Làm thế thì chương trình sẽ bị rơi vào vòng lặp vô hạn và bị treo anh ạ.
|
|
|
Em có hàm sau:
Code:
Recursivite::Try(int j)
{
for(int i=0;i<8;i++)
if(a[i]&&b[i+j]&&c[i-j+7])
{
x[j]=i;
a[i]=false; b[i+j]=false; c[i-j+7]=false;
if(j<7) Try(j+1);
else [color=red]store()[/color];
a[i]=true; b[i+j]=true; c[i-j+7]=true;
}
return 0;
}
Em muốn hỏi các anh là có cách nào để thay cái hàm store() kia bằng 1 lệnh dừng chương trình, nhảy tới hàm chờ nhận thông điệp từ 1 button, khi ấn button đó thì hàm Try(j) kia sẽ được tiếp tục ko ạ?
Cám ơn các anh trước nhé!
|
|
|
Cám ơn anh nhé!
|
|
|
Em có 1 số câu hỏi, mong các anh giúp đỡ.
- Ở cuối cửa sổ FPU em thấy có ghi ST0, ST1, ST2,... Đó là những gì ạ?
- Em có 1 đoạn mã lệnh nhưng ko hiểu các lệnh có chữ F ở đầu (như là FLD, FCOM, FSTSW,...), các anh có thể giải thích qua cho em hiểu các câu lệnh đó có tác dụng gì ko ạ?
Code:
004012E3 |. DC35 38B34000 FDIV QWORD PTR DS:[40B338]
004012E9 |. DD15 20E64000 FST QWORD PTR DS:[40E620]
004012EF |. D9C0 FLD ST
004012F1 |. D8C9 FMUL ST,ST(1)
004012F3 |. DD05 10E64000 FLD QWORD PTR DS:[40E610]
004012F9 |. D9C0 FLD ST
004012FB |. D8C9 FMUL ST,ST(1)
004012FD |. DEC2 FADDP ST(2),ST
004012FF |. DD05 30B34000 FLD QWORD PTR DS:[40B330]
00401305 |. D8D2 FCOM ST(2)
00401307 |. DFE0 FSTSW AX
Cám ơn các anh trước nhé!
|
|
|
Cám ơn anh, em đã thay push addr overlapped bằng push null là đc rồi ạ!
|
|
|
Em còn 1 đoạn code đọc file nữa, sau khi gọi hàm setfilepointer xong, eax mang giá trị 30, nhưng dữ liệu đọc được từ hàm readfile lại từ đầu file chứ ko phải từ byte thứ 30:
Code:
mov eax,FILE_BEGIN
push eax
push NULL
mov eax,30h
push eax
mov eax,file_handle
push eax
mov eax,setfilepointer
call eax
lea eax,overlapped
push eax
lea eax,numread
push eax
mov eax,400h
push eax
lea eax,buffer
push eax
mov eax,file_handle
push eax
mov eax,readfile
call eax
|
|
|
eax mang đúng giá trị cuối file luôn ạ (trong ví dụ của em thì file cần ghi lên có A00 bytes thì eax cũng mang giá trị A00 sau khi gọi hàm setfilepointer). Hay là hàm WriteFile chỉ ghi lên đầu file hả anh?
|
|
|
Em dùng hàm setfilepointer để dịch chuyển tới cuối file để ghi file dữ liệu lên file, nhưng ko biết tại sao sau khi dùng hàm setpointer xong, dùng hàm writefile thì dữ liệu vẫn cứ bị ghi vào đầu file. Tương tự với hàm readfile, sau khi em setfilepointer tới vị trí 3ch thì dữ liệu đọc đc vẫn là đầu file. Đây là đoạn code của em:
Code:
mov eax,FILE_END
push eax
push NULL
push NULL
mov eax,file_handle
push eax
mov eax,setfilepointer ; setfilepointer chứa địa chỉ hàm SetFilePointer
call eax
lea eax,overlapped
push eax
lea eax,numwrite
push eax
mov eax,end-start
push eax
lea eax,start
push eax
mov eax,file_handle
push eax
mov eax,writefile ; writefile chứa địa chỉ hàm WriteFile
call eax
Các anh có thể giải thích cho em tại sao lại ko ghi được vào cuối file mà vẫn ghi vào đầu file ko ạ, cách khắc phục là thế nào ạ?
Cám ơn các anh trước nhé!
|
|
|
Cám ơn anh nhiều nhé!!!
|
|
|
Em quên mất điều đấy đấy , cám ơn anh nhé!!!
|
|
|
Em có đoạn code đơn giản sau để tìm kiếm file:
Code:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
include \masm32\include\user32.inc
includelib user32.lib
.data
search_handle dd 0
lpFileName db "*.*",0
lpFindFileData WIN32_FIND_DATA <>
.code
start:
invoke FindFirstFile,addr lpFileName,addr lpFindFileData
cmp eax,-1
je error
mov search_handle,eax
findnext:
invoke FindNextFile,search_handle,addr lpFindFileData
cmp eax,0
je error
loop findnext
error:
invoke ExitProcess, NULL
end start
Nếu chạy chương trình với đoạn code trên thì nó chạy bình thường, nhưng ý tưởng của em là muốn đưa cả data và code vào cùng 1 section:
Code:
.code
search_handle dd 0
lpFileName db "*.*",0
lpFindFileData WIN32_FIND_DATA <>
start:
invoke FindFirstFile,addr lpFileName,addr lpFindFileData
cmp eax,-1
je error
mov search_handle,eax
findnext:
invoke FindNextFile,search_handle,addr lpFindFileData
cmp eax,0
je error
loop findnext
error:
invoke ExitProcess, NULL
end start
Khi chạy chương trình với đoạn code trên thì sẽ bị lỗi, các anh có thể cho em biết tại sao ko ạ và muốn đưa cả code và data vào cùng 1 section thì phải làm thế nào ạ?
Cám ơn các anh trước nhé!
|
|
|
Em đã giải quyết xong đoạn code trên rồi, tuy nhiên vẫn còn 1 vấn đề, nếu em đưa khai báo
Code:
search_handle dd 0
lpFileName db "*.*",0
lpFindFileData WIN32_FIND_DATA <>
vào code, ko sử dụng data section thì chương trình khi chạy sẽ gặp lỗi (khi debug sẽ thấy lỗi ở ngay hàm findfirstfile).
Đoạn code để chạy đc là phải đưa các biến vào section data:
Code:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
include \masm32\include\user32.inc
includelib user32.lib
.data
search_handle dd 0
lpFileName db "*.*",0
lpFindFileData WIN32_FIND_DATA <>
.code
start:
invoke FindFirstFile,addr lpFileName,addr lpFindFileData
cmp eax,-1
je error
mov search_handle,eax
findnext:
invoke FindNextFile,search_handle,addr lpFindFileData
cmp eax,0
je error
loop findnext
error:
invoke ExitProcess, NULL
end start
Các anh có thể cho em biết lý do vì sao lại lỗi và em muốn đưa cả biến và code vào cùng 1 section thì phải làm thế nào ko ạ?
|
|
|
Hic, anh có thể viết lại cho em đoạn khai báo đc ko ạ, lần trước em hỏi thì anh mfeng nói khai báo như vậy, em ko tìm thấy ở đâu nói về khai báo cả.
Còn đoạn nạp địa chỉ thì em thay
Code:
mov eax,lpFindFileData
push eax
bằng
Code:
lea eax,lpFindFileData
push eax
thì lại ko compile đc, bị báo lỗi.
|
|
|
Em đang bắt đầu học asm32, em có đoạn code sau để tìm kiếm file trong thư mục nhưng ko hiểu sao khi chạy lại có lỗi này:
Đoạn code của em:
Code:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
include \masm32\include\user32.inc
includelib user32.lib
.code
search_handle dd 0
lpFileName db "*.*",0
lpFindFileData STRUCT
dwFileAttributes DWORD ?
ftCreationTime FILETIME <>
ftLastAccessTime FILETIME <>
ftLastWriteTime FILETIME <>
nFileSizeHigh DWORD ?
nFileSizeLow DWORD ?
dwReserved0 DWORD ?
dwReserved1 DWORD ?
cFileName BYTE MAX_PATH dup(?)
cAlternate BYTE 14 dup(?)
lpFindFileData ENDS
start:
mov eax,lpFindFileData
push eax
lea eax,lpFileName
push eax
call FindFirstFileA
cmp eax,-1
je error
mov search_handle,eax
findnext:
mov eax,lpFindFileData
push eax
lea eax,search_handle
push eax
call FindNextFileA
cmp eax,0
je error
loop findnext
error:
invoke ExitProcess, NULL
end start
Các anh có thể xem hộ em là lý do vì sao lại ko chạy đc ko ạ?
|
|
|
Cám ơn anh mfeng!
|
|
|
|
|
|
|